vertex-notes 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-4QLCD6TZ.js → chunk-EEEL6ZKK.js} +378 -43
- package/dist/chunk-EEEL6ZKK.js.map +1 -0
- package/dist/{chunk-DDFOKGIX.js → chunk-URRSVCB7.js} +2 -2
- package/dist/commands/capture.js +2 -2
- package/dist/commands/daily.js +2 -2
- package/dist/commands/delete.js +2 -2
- package/dist/commands/edit.js +3 -5
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/export.js +2 -2
- package/dist/commands/hello.js +1 -1
- package/dist/commands/help.js +23 -14
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/howto.js +379 -0
- package/dist/commands/howto.js.map +1 -0
- package/dist/commands/import.js +39 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/interactive.js +187 -74
- package/dist/commands/interactive.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/new.js +2 -2
- package/dist/commands/notes.js +2 -2
- package/dist/commands/restore.js +2 -2
- package/dist/commands/search.js +2 -2
- package/dist/commands/status.js +2 -2
- package/dist/commands/syntax.js +276 -0
- package/dist/commands/syntax.js.map +1 -0
- package/dist/commands/tags.js +2 -2
- package/dist/commands/today.js +2 -2
- package/dist/commands/trash/empty.js +2 -2
- package/dist/commands/trash/index.js +2 -2
- package/dist/commands/view.js +2 -2
- package/dist/lib/client.js +2 -2
- package/dist/lib/md-to-tiptap.js +245 -3
- package/dist/lib/md-to-tiptap.js.map +1 -1
- package/package.json +2 -1
- package/dist/chunk-4QLCD6TZ.js.map +0 -1
- package/dist/chunk-FWK2J3FR.js +0 -163
- package/dist/chunk-FWK2J3FR.js.map +0 -1
- /package/dist/{chunk-DDFOKGIX.js.map → chunk-URRSVCB7.js.map} +0 -0
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
|
+
exportNoteAsMarkdown,
|
|
7
8
|
getBlocksForNote,
|
|
8
9
|
listNotes,
|
|
10
|
+
markdownToTiptap,
|
|
9
11
|
saveNoteContent
|
|
10
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
11
13
|
|
|
12
14
|
// src/commands/interactive.ts
|
|
13
15
|
import { Command, Args } from "@oclif/core";
|
|
16
|
+
var DIM = "\x1B[90m";
|
|
17
|
+
var BOLD = "\x1B[1m";
|
|
18
|
+
var GREEN = "\x1B[32m";
|
|
19
|
+
var CYAN = "\x1B[36m";
|
|
20
|
+
var YELLOW = "\x1B[33m";
|
|
21
|
+
var PURPLE = "\x1B[35m";
|
|
22
|
+
var R = "\x1B[0m";
|
|
23
|
+
var STRIKE = "\x1B[9m";
|
|
24
|
+
function extractText(node) {
|
|
25
|
+
if (typeof node.text === "string") return node.text;
|
|
26
|
+
const content = node.content;
|
|
27
|
+
if (!content) return "";
|
|
28
|
+
return content.map(extractText).join("");
|
|
29
|
+
}
|
|
14
30
|
function blocksToItems(blocks) {
|
|
15
31
|
const items = [];
|
|
16
32
|
for (const b of blocks) {
|
|
@@ -21,91 +37,125 @@ function blocksToItems(blocks) {
|
|
|
21
37
|
continue;
|
|
22
38
|
}
|
|
23
39
|
const type = tiptap.type;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
const attrs = tiptap.attrs ?? {};
|
|
41
|
+
switch (type) {
|
|
42
|
+
case "heading":
|
|
43
|
+
items.push({ kind: "heading", text: extractText(tiptap), checked: false, level: attrs.level ?? 1 });
|
|
44
|
+
break;
|
|
45
|
+
case "taskList":
|
|
46
|
+
for (const child of tiptap.content ?? []) {
|
|
47
|
+
const ca = child.attrs ?? {};
|
|
48
|
+
items.push({ kind: "todo", text: extractText(child), checked: ca.checked === true });
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case "bulletList":
|
|
52
|
+
for (const child of tiptap.content ?? []) {
|
|
53
|
+
items.push({ kind: "bullet", text: extractText(child), checked: false });
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
case "orderedList":
|
|
57
|
+
(tiptap.content ?? []).forEach((child, idx) => {
|
|
58
|
+
items.push({ kind: "text", text: `${idx + 1}. ${extractText(child)}`, checked: false });
|
|
59
|
+
});
|
|
60
|
+
break;
|
|
61
|
+
case "codeBlock":
|
|
62
|
+
items.push({ kind: "code", text: extractText(tiptap), checked: false, language: attrs.language ?? "" });
|
|
63
|
+
break;
|
|
64
|
+
case "mermaidBlock":
|
|
65
|
+
items.push({ kind: "mermaid", text: extractText(tiptap), checked: false });
|
|
66
|
+
break;
|
|
67
|
+
case "mathBlock":
|
|
68
|
+
items.push({ kind: "math", text: extractText(tiptap), checked: false });
|
|
69
|
+
break;
|
|
70
|
+
case "calloutBlock":
|
|
71
|
+
items.push({ kind: "callout", text: extractText(tiptap), checked: false, variant: attrs.variant ?? "info" });
|
|
72
|
+
break;
|
|
73
|
+
case "blockquote":
|
|
74
|
+
items.push({ kind: "quote", text: extractText(tiptap), checked: false });
|
|
75
|
+
break;
|
|
76
|
+
case "horizontalRule":
|
|
77
|
+
items.push({ kind: "divider", text: "", checked: false });
|
|
78
|
+
break;
|
|
79
|
+
case "image":
|
|
80
|
+
items.push({ kind: "image", text: attrs.alt || attrs.src || "image", checked: false });
|
|
81
|
+
break;
|
|
82
|
+
case "fileBlock":
|
|
83
|
+
items.push({ kind: "file", text: attrs.filename || "file", checked: false });
|
|
84
|
+
break;
|
|
85
|
+
default: {
|
|
86
|
+
const text = extractText(tiptap);
|
|
87
|
+
if (text.trim()) items.push({ kind: "text", text, checked: false });
|
|
31
88
|
}
|
|
32
|
-
} else if (type === "paragraph" || type === "heading") {
|
|
33
|
-
const text = extractText(tiptap);
|
|
34
|
-
if (text.trim()) items.push({ kind: "text", text, checked: false });
|
|
35
89
|
}
|
|
36
90
|
}
|
|
37
91
|
return items;
|
|
38
92
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
function itemsToTiptap(items) {
|
|
46
|
-
const content = [];
|
|
47
|
-
let i = 0;
|
|
48
|
-
while (i < items.length) {
|
|
49
|
-
const item = items[i];
|
|
50
|
-
if (item.kind === "todo") {
|
|
51
|
-
const taskItems = [];
|
|
52
|
-
while (i < items.length && items[i].kind === "todo") {
|
|
53
|
-
taskItems.push({
|
|
54
|
-
type: "taskItem",
|
|
55
|
-
attrs: { checked: items[i].checked },
|
|
56
|
-
content: [{ type: "paragraph", content: [{ type: "text", text: items[i].text }] }]
|
|
57
|
-
});
|
|
58
|
-
i++;
|
|
59
|
-
}
|
|
60
|
-
content.push({ type: "taskList", content: taskItems });
|
|
61
|
-
} else {
|
|
62
|
-
content.push({
|
|
63
|
-
type: "paragraph",
|
|
64
|
-
content: [{ type: "text", text: item.text }]
|
|
65
|
-
});
|
|
66
|
-
i++;
|
|
93
|
+
function renderItem(item, selected) {
|
|
94
|
+
const ptr = selected ? `${CYAN} \u25B8 ${R}` : " ";
|
|
95
|
+
switch (item.kind) {
|
|
96
|
+
case "heading": {
|
|
97
|
+
const hashes = "#".repeat(item.level ?? 1);
|
|
98
|
+
return `${ptr}${BOLD}${hashes} ${item.text}${R}`;
|
|
67
99
|
}
|
|
100
|
+
case "todo": {
|
|
101
|
+
const box = item.checked ? `${GREEN}[\u2713]${R}` : `${DIM}[ ]${R}`;
|
|
102
|
+
const text = item.checked ? `${DIM}${STRIKE}${item.text}${R}` : item.text;
|
|
103
|
+
return `${ptr}${box} ${text}`;
|
|
104
|
+
}
|
|
105
|
+
case "bullet":
|
|
106
|
+
return `${ptr}${DIM}\u2022${R} ${item.text}`;
|
|
107
|
+
case "code":
|
|
108
|
+
return `${ptr}${DIM}\u250C code${item.language ? ` (${item.language})` : ""}${R}
|
|
109
|
+
${item.text.split("\n").map((l) => ` ${DIM}\u2502${R} ${l}`).join("\n")}
|
|
110
|
+
${DIM}\u2514\u2500\u2500${R}`;
|
|
111
|
+
case "mermaid":
|
|
112
|
+
return `${ptr}${PURPLE}\u250C mermaid${R}
|
|
113
|
+
${item.text.split("\n").map((l) => ` ${PURPLE}\u2502${R} ${DIM}${l}${R}`).join("\n")}
|
|
114
|
+
${PURPLE}\u2514\u2500\u2500${R}`;
|
|
115
|
+
case "math":
|
|
116
|
+
return `${ptr}${YELLOW}\u250C math${R}
|
|
117
|
+
${item.text.split("\n").map((l) => ` ${YELLOW}\u2502${R} ${l}`).join("\n")}
|
|
118
|
+
${YELLOW}\u2514\u2500\u2500${R}`;
|
|
119
|
+
case "callout":
|
|
120
|
+
return `${ptr}${CYAN}[${(item.variant ?? "info").toUpperCase()}]${R} ${item.text}`;
|
|
121
|
+
case "quote":
|
|
122
|
+
return `${ptr}${DIM}\u258E${R} ${DIM}${item.text}${R}`;
|
|
123
|
+
case "divider":
|
|
124
|
+
return ` ${DIM}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${R}`;
|
|
125
|
+
case "image":
|
|
126
|
+
return `${ptr}${DIM}[image: ${item.text}]${R}`;
|
|
127
|
+
case "file":
|
|
128
|
+
return `${ptr}${DIM}[file: ${item.text}]${R}`;
|
|
129
|
+
default:
|
|
130
|
+
return `${ptr}${item.text}`;
|
|
68
131
|
}
|
|
69
|
-
if (content.length === 0) {
|
|
70
|
-
content.push({ type: "paragraph" });
|
|
71
|
-
}
|
|
72
|
-
return { type: "doc", content };
|
|
73
132
|
}
|
|
74
133
|
function render(items, cursor, mode, inputBuffer, noteTitle) {
|
|
75
134
|
process.stdout.write("\x1Bc");
|
|
76
|
-
process.stdout.write(
|
|
135
|
+
process.stdout.write(`${BOLD} ${noteTitle}${R}
|
|
77
136
|
`);
|
|
78
|
-
process.stdout.write(
|
|
137
|
+
process.stdout.write(`${DIM} \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${R}
|
|
79
138
|
|
|
80
139
|
`);
|
|
81
140
|
for (let i = 0; i < items.length; i++) {
|
|
82
|
-
|
|
83
|
-
const selected = i === cursor;
|
|
84
|
-
const prefix = selected ? "\x1B[36m \u25B8 \x1B[0m" : " ";
|
|
85
|
-
if (item.kind === "todo") {
|
|
86
|
-
const box = item.checked ? "\x1B[32m[\u2713]\x1B[0m" : "\x1B[90m[ ]\x1B[0m";
|
|
87
|
-
const text = item.checked ? `\x1B[90m\x1B[9m${item.text}\x1B[0m` : item.text;
|
|
88
|
-
process.stdout.write(`${prefix}${box} ${text}
|
|
89
|
-
`);
|
|
90
|
-
} else {
|
|
91
|
-
process.stdout.write(`${prefix}${item.text}
|
|
92
|
-
`);
|
|
93
|
-
}
|
|
141
|
+
process.stdout.write(renderItem(items[i], i === cursor) + "\n");
|
|
94
142
|
}
|
|
95
143
|
if (items.length === 0) {
|
|
96
|
-
process.stdout.write(
|
|
144
|
+
process.stdout.write(` ${DIM}(empty)${R}
|
|
145
|
+
`);
|
|
97
146
|
}
|
|
98
147
|
process.stdout.write(`
|
|
99
|
-
|
|
148
|
+
${DIM} \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${R}
|
|
100
149
|
`);
|
|
101
150
|
if (mode === "input-todo") {
|
|
102
|
-
process.stdout.write(`
|
|
151
|
+
process.stdout.write(` ${YELLOW}New todo:${R} ${inputBuffer}\x1B[7m \x1B[0m
|
|
103
152
|
`);
|
|
104
153
|
} else if (mode === "input-text") {
|
|
105
|
-
process.stdout.write(`
|
|
154
|
+
process.stdout.write(` ${YELLOW}New text:${R} ${inputBuffer}\x1B[7m \x1B[0m
|
|
106
155
|
`);
|
|
107
156
|
} else {
|
|
108
|
-
process.stdout.write(
|
|
157
|
+
process.stdout.write(` ${DIM}\u2191\u2193 move Enter toggle t todo n text d delete e edit in $EDITOR s save q quit${R}
|
|
158
|
+
`);
|
|
109
159
|
}
|
|
110
160
|
}
|
|
111
161
|
var Interactive = class _Interactive extends Command {
|
|
@@ -124,7 +174,7 @@ var Interactive = class _Interactive extends Command {
|
|
|
124
174
|
this.error(`No note matching "${args.title}"`);
|
|
125
175
|
}
|
|
126
176
|
const blocks = await getBlocksForNote(client, match.id);
|
|
127
|
-
|
|
177
|
+
let items = blocksToItems(blocks);
|
|
128
178
|
let cursor = 0;
|
|
129
179
|
let dirty = false;
|
|
130
180
|
let mode = "normal";
|
|
@@ -138,10 +188,73 @@ var Interactive = class _Interactive extends Command {
|
|
|
138
188
|
process.stdout.write("\x1Bc");
|
|
139
189
|
};
|
|
140
190
|
const save = async () => {
|
|
141
|
-
const
|
|
191
|
+
const md = items.map((item) => {
|
|
192
|
+
switch (item.kind) {
|
|
193
|
+
case "heading":
|
|
194
|
+
return `${"#".repeat(item.level ?? 1)} ${item.text}`;
|
|
195
|
+
case "todo":
|
|
196
|
+
return `- [${item.checked ? "x" : " "}] ${item.text}`;
|
|
197
|
+
case "bullet":
|
|
198
|
+
return `- ${item.text}`;
|
|
199
|
+
case "code":
|
|
200
|
+
return `\`\`\`${item.language ?? ""}
|
|
201
|
+
${item.text}
|
|
202
|
+
\`\`\``;
|
|
203
|
+
case "mermaid":
|
|
204
|
+
return `\`\`\`mermaid
|
|
205
|
+
${item.text}
|
|
206
|
+
\`\`\``;
|
|
207
|
+
case "math":
|
|
208
|
+
return `$$
|
|
209
|
+
${item.text}
|
|
210
|
+
$$`;
|
|
211
|
+
case "callout":
|
|
212
|
+
return `> [!${item.variant ?? "info"}]
|
|
213
|
+
> ${item.text}`;
|
|
214
|
+
case "quote":
|
|
215
|
+
return `> ${item.text}`;
|
|
216
|
+
case "divider":
|
|
217
|
+
return "---";
|
|
218
|
+
case "image":
|
|
219
|
+
return ``;
|
|
220
|
+
case "file":
|
|
221
|
+
return `> [!file]
|
|
222
|
+
> ${item.text}`;
|
|
223
|
+
default:
|
|
224
|
+
return item.text;
|
|
225
|
+
}
|
|
226
|
+
}).join("\n\n");
|
|
227
|
+
const tiptap = markdownToTiptap(md);
|
|
142
228
|
await saveNoteContent(client, match.id, userId, tiptap);
|
|
143
229
|
dirty = false;
|
|
144
230
|
};
|
|
231
|
+
const openEditor = async () => {
|
|
232
|
+
cleanup();
|
|
233
|
+
const { tmpdir } = await import("os");
|
|
234
|
+
const { join } = await import("path");
|
|
235
|
+
const { writeFileSync, readFileSync } = await import("fs");
|
|
236
|
+
const { execSync } = await import("child_process");
|
|
237
|
+
const md = await exportNoteAsMarkdown(client, match.id);
|
|
238
|
+
const tmpFile = join(tmpdir(), `vertex-${match.id}.md`);
|
|
239
|
+
writeFileSync(tmpFile, md, "utf-8");
|
|
240
|
+
const editor = process.env.EDITOR || process.env.VISUAL || "vim";
|
|
241
|
+
try {
|
|
242
|
+
execSync(`${editor} "${tmpFile}"`, { stdio: "inherit" });
|
|
243
|
+
} catch {
|
|
244
|
+
}
|
|
245
|
+
const edited = readFileSync(tmpFile, "utf-8");
|
|
246
|
+
if (edited !== md) {
|
|
247
|
+
const tiptap = markdownToTiptap(edited);
|
|
248
|
+
await saveNoteContent(client, match.id, userId, tiptap);
|
|
249
|
+
}
|
|
250
|
+
const newBlocks = await getBlocksForNote(client, match.id);
|
|
251
|
+
items = blocksToItems(newBlocks);
|
|
252
|
+
cursor = Math.min(cursor, Math.max(0, items.length - 1));
|
|
253
|
+
dirty = false;
|
|
254
|
+
process.stdin.setRawMode(true);
|
|
255
|
+
process.stdin.resume();
|
|
256
|
+
render(items, cursor, mode, inputBuffer, match.title);
|
|
257
|
+
};
|
|
145
258
|
process.stdin.on("data", async (key) => {
|
|
146
259
|
if (mode === "input-todo" || mode === "input-text") {
|
|
147
260
|
if (key === "\r" || key === "\n") {
|
|
@@ -185,20 +298,20 @@ var Interactive = class _Interactive extends Command {
|
|
|
185
298
|
cursor = Math.min(cursor, items.length - 1);
|
|
186
299
|
dirty = true;
|
|
187
300
|
}
|
|
301
|
+
} else if (key === "e") {
|
|
302
|
+
if (dirty) await save();
|
|
303
|
+
await openEditor();
|
|
304
|
+
return;
|
|
188
305
|
} else if (key === "s") {
|
|
189
306
|
await save();
|
|
190
307
|
render(items, cursor, mode, inputBuffer, match.title);
|
|
191
|
-
process.stdout.write(
|
|
308
|
+
process.stdout.write(` ${GREEN}Saved!${R}
|
|
309
|
+
`);
|
|
192
310
|
return;
|
|
193
311
|
} else if (key === "q" || key === "") {
|
|
194
|
-
if (dirty)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
this.log(`Saved: ${match.title}`);
|
|
198
|
-
} else {
|
|
199
|
-
cleanup();
|
|
200
|
-
this.log("No changes.");
|
|
201
|
-
}
|
|
312
|
+
if (dirty) await save();
|
|
313
|
+
cleanup();
|
|
314
|
+
this.log(dirty ? `Saved: ${match.title}` : "No changes.");
|
|
202
315
|
process.exit(0);
|
|
203
316
|
}
|
|
204
317
|
render(items, cursor, mode, inputBuffer, match.title);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/interactive.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { listNotes, getBlocksForNote, saveNoteContent, type Block } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\ninterface TuiItem {\n kind: \"text\" | \"todo\";\n text: string;\n checked: boolean;\n}\n\nfunction blocksToItems(blocks: Block[]): TuiItem[] {\n const items: TuiItem[] = [];\n for (const b of blocks) {\n const meta = b.metadata as Record<string, unknown>;\n const tiptap = meta.tiptap as Record<string, unknown> | undefined;\n if (!tiptap) {\n if (b.content.trim()) items.push({ kind: \"text\", text: b.content, checked: false });\n continue;\n }\n\n const type = tiptap.type as string;\n if (type === \"taskList\") {\n const children = (tiptap.content ?? []) as Array<Record<string, unknown>>;\n for (const child of children) {\n const attrs = (child.attrs ?? {}) as Record<string, unknown>;\n const checked = attrs.checked === true;\n const text = extractText(child);\n items.push({ kind: \"todo\", text, checked });\n }\n } else if (type === \"paragraph\" || type === \"heading\") {\n const text = extractText(tiptap);\n if (text.trim()) items.push({ kind: \"text\", text, checked: false });\n }\n }\n return items;\n}\n\nfunction extractText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractText).join(\"\");\n}\n\nfunction itemsToTiptap(items: TuiItem[]): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n\n let i = 0;\n while (i < items.length) {\n const item = items[i];\n if (item.kind === \"todo\") {\n const taskItems: Array<Record<string, unknown>> = [];\n while (i < items.length && items[i].kind === \"todo\") {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: items[i].checked },\n content: [{ type: \"paragraph\", content: [{ type: \"text\", text: items[i].text }] }],\n });\n i++;\n }\n content.push({ type: \"taskList\", content: taskItems });\n } else {\n content.push({\n type: \"paragraph\",\n content: [{ type: \"text\", text: item.text }],\n });\n i++;\n }\n }\n\n if (content.length === 0) {\n content.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content };\n}\n\nfunction render(items: TuiItem[], cursor: number, mode: string, inputBuffer: string, noteTitle: string): void {\n process.stdout.write(\"\\x1bc\");\n\n process.stdout.write(`\\x1b[1m ${noteTitle}\\x1b[0m\\n`);\n process.stdout.write(`\\x1b[90m ─────────────────────────────────────\\x1b[0m\\n\\n`);\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const selected = i === cursor;\n const prefix = selected ? \"\\x1b[36m ▸ \\x1b[0m\" : \" \";\n\n if (item.kind === \"todo\") {\n const box = item.checked ? \"\\x1b[32m[✓]\\x1b[0m\" : \"\\x1b[90m[ ]\\x1b[0m\";\n const text = item.checked ? `\\x1b[90m\\x1b[9m${item.text}\\x1b[0m` : item.text;\n process.stdout.write(`${prefix}${box} ${text}\\n`);\n } else {\n process.stdout.write(`${prefix}${item.text}\\n`);\n }\n }\n\n if (items.length === 0) {\n process.stdout.write(\" \\x1b[90m(empty)\\x1b[0m\\n\");\n }\n\n process.stdout.write(`\\n\\x1b[90m ─────────────────────────────────────\\x1b[0m\\n`);\n\n if (mode === \"input-todo\") {\n process.stdout.write(` \\x1b[33mNew todo:\\x1b[0m ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else if (mode === \"input-text\") {\n process.stdout.write(` \\x1b[33mNew text:\\x1b[0m ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else {\n process.stdout.write(\" \\x1b[90m↑↓ move Enter toggle t new todo n new text d delete s save q quit\\x1b[0m\\n\");\n }\n}\n\nexport default class Interactive extends Command {\n static override description = \"Interactive note editor with todo toggling\";\n\n static override args = {\n title: Args.string({ description: \"Note title (partial match)\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Interactive);\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const query = args.title.toLowerCase();\n const match = notes.find((n) => !n.deleted_at && n.title.toLowerCase().includes(query));\n\n if (!match) {\n this.error(`No note matching \"${args.title}\"`);\n }\n\n const blocks = await getBlocksForNote(client, match.id);\n const items = blocksToItems(blocks);\n let cursor = 0;\n let dirty = false;\n let mode = \"normal\";\n let inputBuffer = \"\";\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding(\"utf8\");\n\n render(items, cursor, mode, inputBuffer, match.title);\n\n const cleanup = () => {\n process.stdin.setRawMode(false);\n process.stdout.write(\"\\x1bc\");\n };\n\n const save = async () => {\n const tiptap = itemsToTiptap(items);\n await saveNoteContent(client, match.id, userId, tiptap);\n dirty = false;\n };\n\n process.stdin.on(\"data\", async (key: string) => {\n if (mode === \"input-todo\" || mode === \"input-text\") {\n if (key === \"\\r\" || key === \"\\n\") {\n if (inputBuffer.trim()) {\n const newItem: TuiItem = mode === \"input-todo\"\n ? { kind: \"todo\", text: inputBuffer.trim(), checked: false }\n : { kind: \"text\", text: inputBuffer.trim(), checked: false };\n items.splice(cursor + 1, 0, newItem);\n cursor = Math.min(cursor + 1, items.length - 1);\n dirty = true;\n }\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x1b\") {\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x7f\") {\n inputBuffer = inputBuffer.slice(0, -1);\n } else if (key >= \" \") {\n inputBuffer += key;\n }\n render(items, cursor, mode, inputBuffer, match.title);\n return;\n }\n\n if (key === \"\\x1b[A\") {\n cursor = Math.max(0, cursor - 1);\n } else if (key === \"\\x1b[B\") {\n cursor = Math.min(items.length - 1, cursor + 1);\n } else if (key === \"\\r\" || key === \"\\n\") {\n if (items[cursor]?.kind === \"todo\") {\n items[cursor].checked = !items[cursor].checked;\n dirty = true;\n }\n } else if (key === \"t\") {\n mode = \"input-todo\";\n inputBuffer = \"\";\n } else if (key === \"n\") {\n mode = \"input-text\";\n inputBuffer = \"\";\n } else if (key === \"d\") {\n if (items.length > 0) {\n items.splice(cursor, 1);\n cursor = Math.min(cursor, items.length - 1);\n dirty = true;\n }\n } else if (key === \"s\") {\n await save();\n render(items, cursor, mode, inputBuffer, match.title);\n process.stdout.write(\" \\x1b[32mSaved!\\x1b[0m\\n\");\n return;\n } else if (key === \"q\" || key === \"\\x03\") {\n if (dirty) {\n await save();\n cleanup();\n this.log(`Saved: ${match.title}`);\n } else {\n cleanup();\n this.log(\"No changes.\");\n }\n process.exit(0);\n }\n\n render(items, cursor, mode, inputBuffer, match.title);\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/interactive.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { listNotes, getBlocksForNote, saveNoteContent, exportNoteAsMarkdown, type Block } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\nimport { markdownToTiptap } from \"@vertex/core\";\n\ninterface TuiItem {\n kind: \"text\" | \"todo\" | \"heading\" | \"code\" | \"mermaid\" | \"math\" | \"callout\" | \"divider\" | \"bullet\" | \"quote\" | \"file\" | \"image\";\n text: string;\n checked: boolean;\n level?: number;\n language?: string;\n variant?: string;\n raw?: Record<string, unknown>;\n}\n\nconst DIM = \"\\x1b[90m\";\nconst BOLD = \"\\x1b[1m\";\nconst GREEN = \"\\x1b[32m\";\nconst CYAN = \"\\x1b[36m\";\nconst YELLOW = \"\\x1b[33m\";\nconst PURPLE = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\nconst STRIKE = \"\\x1b[9m\";\n\nfunction extractText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractText).join(\"\");\n}\n\nfunction blocksToItems(blocks: Block[]): TuiItem[] {\n const items: TuiItem[] = [];\n for (const b of blocks) {\n const meta = b.metadata as Record<string, unknown>;\n const tiptap = meta.tiptap as Record<string, unknown> | undefined;\n if (!tiptap) {\n if (b.content.trim()) items.push({ kind: \"text\", text: b.content, checked: false });\n continue;\n }\n\n const type = tiptap.type as string;\n const attrs = (tiptap.attrs ?? {}) as Record<string, unknown>;\n\n switch (type) {\n case \"heading\":\n items.push({ kind: \"heading\", text: extractText(tiptap), checked: false, level: (attrs.level as number) ?? 1 });\n break;\n case \"taskList\":\n for (const child of (tiptap.content ?? []) as Array<Record<string, unknown>>) {\n const ca = (child.attrs ?? {}) as Record<string, unknown>;\n items.push({ kind: \"todo\", text: extractText(child), checked: ca.checked === true });\n }\n break;\n case \"bulletList\":\n for (const child of (tiptap.content ?? []) as Array<Record<string, unknown>>) {\n items.push({ kind: \"bullet\", text: extractText(child), checked: false });\n }\n break;\n case \"orderedList\":\n (tiptap.content as Array<Record<string, unknown>> ?? []).forEach((child, idx) => {\n items.push({ kind: \"text\", text: `${idx + 1}. ${extractText(child)}`, checked: false });\n });\n break;\n case \"codeBlock\":\n items.push({ kind: \"code\", text: extractText(tiptap), checked: false, language: (attrs.language as string) ?? \"\" });\n break;\n case \"mermaidBlock\":\n items.push({ kind: \"mermaid\", text: extractText(tiptap), checked: false });\n break;\n case \"mathBlock\":\n items.push({ kind: \"math\", text: extractText(tiptap), checked: false });\n break;\n case \"calloutBlock\":\n items.push({ kind: \"callout\", text: extractText(tiptap), checked: false, variant: (attrs.variant as string) ?? \"info\" });\n break;\n case \"blockquote\":\n items.push({ kind: \"quote\", text: extractText(tiptap), checked: false });\n break;\n case \"horizontalRule\":\n items.push({ kind: \"divider\", text: \"\", checked: false });\n break;\n case \"image\":\n items.push({ kind: \"image\", text: (attrs.alt as string) || (attrs.src as string) || \"image\", checked: false });\n break;\n case \"fileBlock\":\n items.push({ kind: \"file\", text: (attrs.filename as string) || \"file\", checked: false });\n break;\n default: {\n const text = extractText(tiptap);\n if (text.trim()) items.push({ kind: \"text\", text, checked: false });\n }\n }\n }\n return items;\n}\n\nfunction renderItem(item: TuiItem, selected: boolean): string {\n const ptr = selected ? `${CYAN} ▸ ${R}` : \" \";\n\n switch (item.kind) {\n case \"heading\": {\n const hashes = \"#\".repeat(item.level ?? 1);\n return `${ptr}${BOLD}${hashes} ${item.text}${R}`;\n }\n case \"todo\": {\n const box = item.checked ? `${GREEN}[✓]${R}` : `${DIM}[ ]${R}`;\n const text = item.checked ? `${DIM}${STRIKE}${item.text}${R}` : item.text;\n return `${ptr}${box} ${text}`;\n }\n case \"bullet\":\n return `${ptr}${DIM}•${R} ${item.text}`;\n case \"code\":\n return `${ptr}${DIM}┌ code${item.language ? ` (${item.language})` : \"\"}${R}\\n${item.text.split(\"\\n\").map((l) => ` ${DIM}│${R} ${l}`).join(\"\\n\")}\\n ${DIM}└──${R}`;\n case \"mermaid\":\n return `${ptr}${PURPLE}┌ mermaid${R}\\n${item.text.split(\"\\n\").map((l) => ` ${PURPLE}│${R} ${DIM}${l}${R}`).join(\"\\n\")}\\n ${PURPLE}└──${R}`;\n case \"math\":\n return `${ptr}${YELLOW}┌ math${R}\\n${item.text.split(\"\\n\").map((l) => ` ${YELLOW}│${R} ${l}`).join(\"\\n\")}\\n ${YELLOW}└──${R}`;\n case \"callout\":\n return `${ptr}${CYAN}[${(item.variant ?? \"info\").toUpperCase()}]${R} ${item.text}`;\n case \"quote\":\n return `${ptr}${DIM}▎${R} ${DIM}${item.text}${R}`;\n case \"divider\":\n return ` ${DIM}────────────────────────────${R}`;\n case \"image\":\n return `${ptr}${DIM}[image: ${item.text}]${R}`;\n case \"file\":\n return `${ptr}${DIM}[file: ${item.text}]${R}`;\n default:\n return `${ptr}${item.text}`;\n }\n}\n\nfunction render(items: TuiItem[], cursor: number, mode: string, inputBuffer: string, noteTitle: string): void {\n process.stdout.write(\"\\x1bc\");\n process.stdout.write(`${BOLD} ${noteTitle}${R}\\n`);\n process.stdout.write(`${DIM} ─────────────────────────────────────${R}\\n\\n`);\n\n for (let i = 0; i < items.length; i++) {\n process.stdout.write(renderItem(items[i], i === cursor) + \"\\n\");\n }\n\n if (items.length === 0) {\n process.stdout.write(` ${DIM}(empty)${R}\\n`);\n }\n\n process.stdout.write(`\\n${DIM} ─────────────────────────────────────${R}\\n`);\n\n if (mode === \"input-todo\") {\n process.stdout.write(` ${YELLOW}New todo:${R} ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else if (mode === \"input-text\") {\n process.stdout.write(` ${YELLOW}New text:${R} ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else {\n process.stdout.write(` ${DIM}↑↓ move Enter toggle t todo n text d delete e edit in $EDITOR s save q quit${R}\\n`);\n }\n}\n\nexport default class Interactive extends Command {\n static override description = \"Interactive note editor with todo toggling\";\n\n static override args = {\n title: Args.string({ description: \"Note title (partial match)\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Interactive);\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const query = args.title.toLowerCase();\n const match = notes.find((n) => !n.deleted_at && n.title.toLowerCase().includes(query));\n\n if (!match) {\n this.error(`No note matching \"${args.title}\"`);\n }\n\n const blocks = await getBlocksForNote(client, match.id);\n let items = blocksToItems(blocks);\n let cursor = 0;\n let dirty = false;\n let mode = \"normal\";\n let inputBuffer = \"\";\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding(\"utf8\");\n\n render(items, cursor, mode, inputBuffer, match.title);\n\n const cleanup = () => {\n process.stdin.setRawMode(false);\n process.stdout.write(\"\\x1bc\");\n };\n\n const save = async () => {\n const md = items.map((item) => {\n switch (item.kind) {\n case \"heading\": return `${\"#\".repeat(item.level ?? 1)} ${item.text}`;\n case \"todo\": return `- [${item.checked ? \"x\" : \" \"}] ${item.text}`;\n case \"bullet\": return `- ${item.text}`;\n case \"code\": return `\\`\\`\\`${item.language ?? \"\"}\\n${item.text}\\n\\`\\`\\``;\n case \"mermaid\": return `\\`\\`\\`mermaid\\n${item.text}\\n\\`\\`\\``;\n case \"math\": return `$$\\n${item.text}\\n$$`;\n case \"callout\": return `> [!${item.variant ?? \"info\"}]\\n> ${item.text}`;\n case \"quote\": return `> ${item.text}`;\n case \"divider\": return \"---\";\n case \"image\": return ``;\n case \"file\": return `> [!file]\\n> ${item.text}`;\n default: return item.text;\n }\n }).join(\"\\n\\n\");\n\n const tiptap = markdownToTiptap(md);\n await saveNoteContent(client, match.id, userId, tiptap);\n dirty = false;\n };\n\n const openEditor = async () => {\n cleanup();\n const { tmpdir } = await import(\"node:os\");\n const { join } = await import(\"node:path\");\n const { writeFileSync, readFileSync } = await import(\"node:fs\");\n const { execSync } = await import(\"node:child_process\");\n\n const md = await exportNoteAsMarkdown(client, match.id);\n const tmpFile = join(tmpdir(), `vertex-${match.id}.md`);\n writeFileSync(tmpFile, md, \"utf-8\");\n\n const editor = process.env.EDITOR || process.env.VISUAL || \"vim\";\n try { execSync(`${editor} \"${tmpFile}\"`, { stdio: \"inherit\" }); } catch { /* */ }\n\n const edited = readFileSync(tmpFile, \"utf-8\");\n if (edited !== md) {\n const tiptap = markdownToTiptap(edited);\n await saveNoteContent(client, match.id, userId, tiptap);\n }\n\n const newBlocks = await getBlocksForNote(client, match.id);\n items = blocksToItems(newBlocks);\n cursor = Math.min(cursor, Math.max(0, items.length - 1));\n dirty = false;\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n render(items, cursor, mode, inputBuffer, match.title);\n };\n\n process.stdin.on(\"data\", async (key: string) => {\n if (mode === \"input-todo\" || mode === \"input-text\") {\n if (key === \"\\r\" || key === \"\\n\") {\n if (inputBuffer.trim()) {\n const newItem: TuiItem = mode === \"input-todo\"\n ? { kind: \"todo\", text: inputBuffer.trim(), checked: false }\n : { kind: \"text\", text: inputBuffer.trim(), checked: false };\n items.splice(cursor + 1, 0, newItem);\n cursor = Math.min(cursor + 1, items.length - 1);\n dirty = true;\n }\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x1b\") {\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x7f\") {\n inputBuffer = inputBuffer.slice(0, -1);\n } else if (key >= \" \") {\n inputBuffer += key;\n }\n render(items, cursor, mode, inputBuffer, match.title);\n return;\n }\n\n if (key === \"\\x1b[A\") {\n cursor = Math.max(0, cursor - 1);\n } else if (key === \"\\x1b[B\") {\n cursor = Math.min(items.length - 1, cursor + 1);\n } else if (key === \"\\r\" || key === \"\\n\") {\n if (items[cursor]?.kind === \"todo\") {\n items[cursor].checked = !items[cursor].checked;\n dirty = true;\n }\n } else if (key === \"t\") {\n mode = \"input-todo\";\n inputBuffer = \"\";\n } else if (key === \"n\") {\n mode = \"input-text\";\n inputBuffer = \"\";\n } else if (key === \"d\") {\n if (items.length > 0) {\n items.splice(cursor, 1);\n cursor = Math.min(cursor, items.length - 1);\n dirty = true;\n }\n } else if (key === \"e\") {\n if (dirty) await save();\n await openEditor();\n return;\n } else if (key === \"s\") {\n await save();\n render(items, cursor, mode, inputBuffer, match.title);\n process.stdout.write(` ${GREEN}Saved!${R}\\n`);\n return;\n } else if (key === \"q\" || key === \"\\x03\") {\n if (dirty) await save();\n cleanup();\n this.log(dirty ? `Saved: ${match.title}` : \"No changes.\");\n process.exit(0);\n }\n\n render(items, cursor, mode, inputBuffer, match.title);\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAe9B,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,IAAI;AACV,IAAM,SAAS;AAEf,SAAS,YAAY,MAAuC;AAC1D,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AAC/C,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,IAAI,WAAW,EAAE,KAAK,EAAE;AACzC;AAEA,SAAS,cAAc,QAA4B;AACjD,QAAM,QAAmB,CAAC;AAC1B,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,EAAE;AACf,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,QAAQ;AACX,UAAI,EAAE,QAAQ,KAAK,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,EAAE,SAAS,SAAS,MAAM,CAAC;AAClF;AAAA,IACF;AAEA,UAAM,OAAO,OAAO;AACpB,UAAM,QAAS,OAAO,SAAS,CAAC;AAEhC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,SAAS,OAAO,OAAQ,MAAM,SAAoB,EAAE,CAAC;AAC9G;AAAA,MACF,KAAK;AACH,mBAAW,SAAU,OAAO,WAAW,CAAC,GAAsC;AAC5E,gBAAM,KAAM,MAAM,SAAS,CAAC;AAC5B,gBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,GAAG,SAAS,GAAG,YAAY,KAAK,CAAC;AAAA,QACrF;AACA;AAAA,MACF,KAAK;AACH,mBAAW,SAAU,OAAO,WAAW,CAAC,GAAsC;AAC5E,gBAAM,KAAK,EAAE,MAAM,UAAU,MAAM,YAAY,KAAK,GAAG,SAAS,MAAM,CAAC;AAAA,QACzE;AACA;AAAA,MACF,KAAK;AACH,SAAC,OAAO,WAA6C,CAAC,GAAG,QAAQ,CAAC,OAAO,QAAQ;AAC/E,gBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,GAAG,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC;AAAA,QACxF,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,MAAM,GAAG,SAAS,OAAO,UAAW,MAAM,YAAuB,GAAG,CAAC;AAClH;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,SAAS,MAAM,CAAC;AACzE;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,MAAM,GAAG,SAAS,MAAM,CAAC;AACtE;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,SAAS,OAAO,SAAU,MAAM,WAAsB,OAAO,CAAC;AACvH;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,SAAS,MAAM,YAAY,MAAM,GAAG,SAAS,MAAM,CAAC;AACvE;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,WAAW,MAAM,IAAI,SAAS,MAAM,CAAC;AACxD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,SAAS,MAAO,MAAM,OAAmB,MAAM,OAAkB,SAAS,SAAS,MAAM,CAAC;AAC7G;AAAA,MACF,KAAK;AACH,cAAM,KAAK,EAAE,MAAM,QAAQ,MAAO,MAAM,YAAuB,QAAQ,SAAS,MAAM,CAAC;AACvF;AAAA,MACF,SAAS;AACP,cAAM,OAAO,YAAY,MAAM;AAC/B,YAAI,KAAK,KAAK,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,SAAS,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAe,UAA2B;AAC5D,QAAM,MAAM,WAAW,GAAG,IAAI,YAAO,CAAC,KAAK;AAE3C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,YAAM,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC;AACzC,aAAO,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC;AAAA,IAChD;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,MAAM,KAAK,UAAU,GAAG,KAAK,WAAM,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC;AAC5D,YAAM,OAAO,KAAK,UAAU,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK;AACrE,aAAO,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI;AAAA,IAC7B;AAAA,IACA,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,GAAG,SAAI,CAAC,IAAI,KAAK,IAAI;AAAA,IACvC,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,GAAG,cAAS,KAAK,WAAW,KAAK,KAAK,QAAQ,MAAM,EAAE,GAAG,CAAC;AAAA,EAAK,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,GAAG,SAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MAAS,GAAG,qBAAM,CAAC;AAAA,IACvK,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,MAAM,iBAAY,CAAC;AAAA,EAAK,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,MAAM,SAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MAAS,MAAM,qBAAM,CAAC;AAAA,IAChJ,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,MAAM,cAAS,CAAC;AAAA,EAAK,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,MAAM,SAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MAAS,MAAM,qBAAM,CAAC;AAAA,IACnI,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,IAAI,KAAK,KAAK,WAAW,QAAQ,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;AAAA,IAClF,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,GAAG,SAAI,CAAC,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC;AAAA,IACjD,KAAK;AACH,aAAO,OAAO,GAAG,2KAA+B,CAAC;AAAA,IACnD,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,GAAG,WAAW,KAAK,IAAI,IAAI,CAAC;AAAA,IAC9C,KAAK;AACH,aAAO,GAAG,GAAG,GAAG,GAAG,UAAU,KAAK,IAAI,IAAI,CAAC;AAAA,IAC7C;AACE,aAAO,GAAG,GAAG,GAAG,KAAK,IAAI;AAAA,EAC7B;AACF;AAEA,SAAS,OAAO,OAAkB,QAAgB,MAAc,aAAqB,WAAyB;AAC5G,UAAQ,OAAO,MAAM,OAAO;AAC5B,UAAQ,OAAO,MAAM,GAAG,IAAI,KAAK,SAAS,GAAG,CAAC;AAAA,CAAI;AAClD,UAAQ,OAAO,MAAM,GAAG,GAAG,mOAA0C,CAAC;AAAA;AAAA,CAAM;AAE5E,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAQ,OAAO,MAAM,WAAW,MAAM,CAAC,GAAG,MAAM,MAAM,IAAI,IAAI;AAAA,EAChE;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,OAAO,MAAM,OAAO,GAAG,UAAU,CAAC;AAAA,CAAI;AAAA,EAChD;AAEA,UAAQ,OAAO,MAAM;AAAA,EAAK,GAAG,mOAA0C,CAAC;AAAA,CAAI;AAE5E,MAAI,SAAS,cAAc;AACzB,YAAQ,OAAO,MAAM,KAAK,MAAM,YAAY,CAAC,IAAI,WAAW;AAAA,CAAmB;AAAA,EACjF,WAAW,SAAS,cAAc;AAChC,YAAQ,OAAO,MAAM,KAAK,MAAM,YAAY,CAAC,IAAI,WAAW;AAAA,CAAmB;AAAA,EACjF,OAAO;AACL,YAAQ,OAAO,MAAM,KAAK,GAAG,+FAAqF,CAAC;AAAA,CAAI;AAAA,EACzH;AACF;AAEA,IAAqB,cAArB,MAAqB,qBAAoB,QAAQ;AAAA,EAC/C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,8BAA8B,UAAU,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,YAAW;AAC7C,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,OAAO,CAAC;AACzD,UAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK,CAAC;AAEtF,QAAI,CAAC,OAAO;AACV,WAAK,MAAM,qBAAqB,KAAK,KAAK,GAAG;AAAA,IAC/C;AAEA,UAAM,SAAS,MAAM,iBAAiB,QAAQ,MAAM,EAAE;AACtD,QAAI,QAAQ,cAAc,MAAM;AAChC,QAAI,SAAS;AACb,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,cAAc;AAElB,YAAQ,MAAM,WAAW,IAAI;AAC7B,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,YAAY,MAAM;AAEhC,WAAO,OAAO,QAAQ,MAAM,aAAa,MAAM,KAAK;AAEpD,UAAM,UAAU,MAAM;AACpB,cAAQ,MAAM,WAAW,KAAK;AAC9B,cAAQ,OAAO,MAAM,OAAO;AAAA,IAC9B;AAEA,UAAM,OAAO,YAAY;AACvB,YAAM,KAAK,MAAM,IAAI,CAAC,SAAS;AAC7B,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AAAW,mBAAO,GAAG,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI;AAAA,UAClE,KAAK;AAAQ,mBAAO,MAAM,KAAK,UAAU,MAAM,GAAG,KAAK,KAAK,IAAI;AAAA,UAChE,KAAK;AAAU,mBAAO,KAAK,KAAK,IAAI;AAAA,UACpC,KAAK;AAAQ,mBAAO,SAAS,KAAK,YAAY,EAAE;AAAA,EAAK,KAAK,IAAI;AAAA;AAAA,UAC9D,KAAK;AAAW,mBAAO;AAAA,EAAkB,KAAK,IAAI;AAAA;AAAA,UAClD,KAAK;AAAQ,mBAAO;AAAA,EAAO,KAAK,IAAI;AAAA;AAAA,UACpC,KAAK;AAAW,mBAAO,OAAO,KAAK,WAAW,MAAM;AAAA,IAAQ,KAAK,IAAI;AAAA,UACrE,KAAK;AAAS,mBAAO,KAAK,KAAK,IAAI;AAAA,UACnC,KAAK;AAAW,mBAAO;AAAA,UACvB,KAAK;AAAS,mBAAO,OAAO,KAAK,IAAI;AAAA,UACrC,KAAK;AAAQ,mBAAO;AAAA,IAAgB,KAAK,IAAI;AAAA,UAC7C;AAAS,mBAAO,KAAK;AAAA,QACvB;AAAA,MACF,CAAC,EAAE,KAAK,MAAM;AAEd,YAAM,SAAS,iBAAiB,EAAE;AAClC,YAAM,gBAAgB,QAAQ,MAAM,IAAI,QAAQ,MAAM;AACtD,cAAQ;AAAA,IACV;AAEA,UAAM,aAAa,YAAY;AAC7B,cAAQ;AACR,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,IAAS;AACzC,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,YAAM,EAAE,eAAe,aAAa,IAAI,MAAM,OAAO,IAAS;AAC9D,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AAEtD,YAAM,KAAK,MAAM,qBAAqB,QAAQ,MAAM,EAAE;AACtD,YAAM,UAAU,KAAK,OAAO,GAAG,UAAU,MAAM,EAAE,KAAK;AACtD,oBAAc,SAAS,IAAI,OAAO;AAElC,YAAM,SAAS,QAAQ,IAAI,UAAU,QAAQ,IAAI,UAAU;AAC3D,UAAI;AAAE,iBAAS,GAAG,MAAM,KAAK,OAAO,KAAK,EAAE,OAAO,UAAU,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAQ;AAEhF,YAAM,SAAS,aAAa,SAAS,OAAO;AAC5C,UAAI,WAAW,IAAI;AACjB,cAAM,SAAS,iBAAiB,MAAM;AACtC,cAAM,gBAAgB,QAAQ,MAAM,IAAI,QAAQ,MAAM;AAAA,MACxD;AAEA,YAAM,YAAY,MAAM,iBAAiB,QAAQ,MAAM,EAAE;AACzD,cAAQ,cAAc,SAAS;AAC/B,eAAS,KAAK,IAAI,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC;AACvD,cAAQ;AAER,cAAQ,MAAM,WAAW,IAAI;AAC7B,cAAQ,MAAM,OAAO;AACrB,aAAO,OAAO,QAAQ,MAAM,aAAa,MAAM,KAAK;AAAA,IACtD;AAEA,YAAQ,MAAM,GAAG,QAAQ,OAAO,QAAgB;AAC9C,UAAI,SAAS,gBAAgB,SAAS,cAAc;AAClD,YAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,cAAI,YAAY,KAAK,GAAG;AACtB,kBAAM,UAAmB,SAAS,eAC9B,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,GAAG,SAAS,MAAM,IACzD,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,GAAG,SAAS,MAAM;AAC7D,kBAAM,OAAO,SAAS,GAAG,GAAG,OAAO;AACnC,qBAAS,KAAK,IAAI,SAAS,GAAG,MAAM,SAAS,CAAC;AAC9C,oBAAQ;AAAA,UACV;AACA,iBAAO;AACP,wBAAc;AAAA,QAChB,WAAW,QAAQ,QAAQ;AACzB,iBAAO;AACP,wBAAc;AAAA,QAChB,WAAW,QAAQ,QAAQ;AACzB,wBAAc,YAAY,MAAM,GAAG,EAAE;AAAA,QACvC,WAAW,OAAO,KAAK;AACrB,yBAAe;AAAA,QACjB;AACA,eAAO,OAAO,QAAQ,MAAM,aAAa,MAAM,KAAK;AACpD;AAAA,MACF;AAEA,UAAI,QAAQ,UAAU;AACpB,iBAAS,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,MACjC,WAAW,QAAQ,UAAU;AAC3B,iBAAS,KAAK,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC;AAAA,MAChD,WAAW,QAAQ,QAAQ,QAAQ,MAAM;AACvC,YAAI,MAAM,MAAM,GAAG,SAAS,QAAQ;AAClC,gBAAM,MAAM,EAAE,UAAU,CAAC,MAAM,MAAM,EAAE;AACvC,kBAAQ;AAAA,QACV;AAAA,MACF,WAAW,QAAQ,KAAK;AACtB,eAAO;AACP,sBAAc;AAAA,MAChB,WAAW,QAAQ,KAAK;AACtB,eAAO;AACP,sBAAc;AAAA,MAChB,WAAW,QAAQ,KAAK;AACtB,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,OAAO,QAAQ,CAAC;AACtB,mBAAS,KAAK,IAAI,QAAQ,MAAM,SAAS,CAAC;AAC1C,kBAAQ;AAAA,QACV;AAAA,MACF,WAAW,QAAQ,KAAK;AACtB,YAAI,MAAO,OAAM,KAAK;AACtB,cAAM,WAAW;AACjB;AAAA,MACF,WAAW,QAAQ,KAAK;AACtB,cAAM,KAAK;AACX,eAAO,OAAO,QAAQ,MAAM,aAAa,MAAM,KAAK;AACpD,gBAAQ,OAAO,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,CAAI;AAC7C;AAAA,MACF,WAAW,QAAQ,OAAO,QAAQ,KAAQ;AACxC,YAAI,MAAO,OAAM,KAAK;AACtB,gBAAQ;AACR,aAAK,IAAI,QAAQ,UAAU,MAAM,KAAK,KAAK,aAAa;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,aAAO,OAAO,QAAQ,MAAM,aAAa,MAAM,KAAK;AAAA,IACtD,CAAC;AAAA,EACH;AACF;","names":[]}
|
package/dist/commands/login.js
CHANGED
package/dist/commands/new.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
createNote
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/new.ts
|
|
11
11
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/notes.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/notes.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
package/dist/commands/restore.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes,
|
|
8
8
|
restoreNote
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/restore.ts
|
|
12
12
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/search.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
executeQuery
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/search.ts
|
|
11
11
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
7
|
} from "../chunk-PBF5EE4Y.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
formatFileSize,
|
|
11
11
|
getStorageInfo,
|
|
12
12
|
listNotes
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/status.ts
|
|
16
16
|
import { Command } from "@oclif/core";
|