vertex-notes 0.1.3 → 0.2.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.
Files changed (40) hide show
  1. package/dist/{chunk-4QLCD6TZ.js → chunk-WM6QVD53.js} +371 -43
  2. package/dist/chunk-WM6QVD53.js.map +1 -0
  3. package/dist/{chunk-DDFOKGIX.js → chunk-XGZKUOFI.js} +2 -2
  4. package/dist/commands/capture.js +2 -2
  5. package/dist/commands/daily.js +2 -2
  6. package/dist/commands/delete.js +2 -2
  7. package/dist/commands/edit.js +3 -5
  8. package/dist/commands/edit.js.map +1 -1
  9. package/dist/commands/export.js +2 -2
  10. package/dist/commands/hello.js +1 -1
  11. package/dist/commands/help.js +23 -14
  12. package/dist/commands/help.js.map +1 -1
  13. package/dist/commands/howto.js +373 -0
  14. package/dist/commands/howto.js.map +1 -0
  15. package/dist/commands/import.js +39 -0
  16. package/dist/commands/import.js.map +1 -0
  17. package/dist/commands/interactive.js +187 -74
  18. package/dist/commands/interactive.js.map +1 -1
  19. package/dist/commands/login.js +6 -2
  20. package/dist/commands/login.js.map +1 -1
  21. package/dist/commands/new.js +2 -2
  22. package/dist/commands/notes.js +2 -2
  23. package/dist/commands/restore.js +2 -2
  24. package/dist/commands/search.js +2 -2
  25. package/dist/commands/status.js +2 -2
  26. package/dist/commands/syntax.js +270 -0
  27. package/dist/commands/syntax.js.map +1 -0
  28. package/dist/commands/tags.js +2 -2
  29. package/dist/commands/today.js +2 -2
  30. package/dist/commands/trash/empty.js +2 -2
  31. package/dist/commands/trash/index.js +2 -2
  32. package/dist/commands/view.js +2 -2
  33. package/dist/lib/client.js +2 -2
  34. package/dist/lib/md-to-tiptap.js +243 -3
  35. package/dist/lib/md-to-tiptap.js.map +1 -1
  36. package/package.json +2 -1
  37. package/dist/chunk-4QLCD6TZ.js.map +0 -1
  38. package/dist/chunk-FWK2J3FR.js +0 -163
  39. package/dist/chunk-FWK2J3FR.js.map +0 -1
  40. /package/dist/{chunk-DDFOKGIX.js.map → chunk-XGZKUOFI.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/howto.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Howto extends Command {\n static override description = \"Complete guide for AI agents to create and manage Vertex notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex — Complete AI Guide${R}\n${D} Everything an AI agent needs to create, edit, and manage notes.${R}\n${D} Read this once, then you can do anything in Vertex.${R}\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 1. WHAT IS VERTEX?${R}\n${D} A knowledge workspace. Notes are stored in the cloud (Supabase).${R}\n${D} You write markdown in the terminal → it renders as rich content${R}\n${D} (diagrams, math, code, callouts) in the web app.${R}\n${D} Notes can link to each other via [[wiki links]] and #tags.${R}\n\n${C}${B} 2. HOW TO CREATE A NOTE${R}\n\n${D} Option A: Create and edit in one step${R}\n ${G}vertex new \"My Note Title\"${R}\n ${G}vertex edit \"My Note\"${R} ${D}← opens in $EDITOR (vim/nano/code)${R}\n\n${D} Option B: Write a .md file, then import${R}\n ${G}cat > note.md << 'EOF'${R}\n ${Y}# My Note Title${R}\n ${Y}Content here...${R}\n ${G}EOF${R}\n ${G}vertex import note.md -t \"My Note Title\"${R}\n\n${D} Option C: Quick one-liner to inbox${R}\n ${G}vertex capture \"Remember to review PR #42\"${R}\n\n${C}${B} 3. HOW TO EDIT AN EXISTING NOTE${R}\n\n ${G}vertex edit \"Note Title\"${R} ${D}← partial match works: \"Note\" matches \"Note Title\"${R}\n${D} This exports the note as markdown, opens your $EDITOR,${R}\n${D} and when you save & quit, it parses the markdown back${R}\n${D} and updates the note in the database.${R}\n\n${D} To use a specific editor:${R}\n ${G}EDITOR=nano vertex edit \"My Note\"${R}\n ${G}EDITOR=\"code --wait\" vertex edit \"My Note\"${R}\n ${G}EDITOR=vim vertex edit \"My Note\"${R}\n\n${C}${B} 4. HOW TO VIEW A NOTE (read-only)${R}\n\n ${G}vertex view \"Note Title\"${R} ${D}← prints markdown to stdout${R}\n ${G}vertex view \"Note\" | less${R} ${D}← paginated view${R}\n ${G}vertex export \"Note\" -o note.md${R} ${D}← save to file${R}\n\n${C}${B} 5. HOW TO LIST AND FIND NOTES${R}\n\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#tagname\"${R} ${D}← search by tag${R}\n ${G}vertex search \"type:todo status:open\"${R} ${D}← find open todos${R}\n ${G}vertex tags${R} ${D}← list all tags${R}\n ${G}vertex daily --last${R} ${D}← view latest daily note${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 6. MARKDOWN SYNTAX — ALL BLOCK TYPES${R}\n\n${D} ┌─ IMPORTANT ────────────────────────────────────────────────${R}\n${D} │ Every block must be separated by a BLANK LINE.${R}\n${D} │ The first # H1 heading becomes the note title.${R}\n${D} │ Tags must start with a letter (a-z): #valid not #123${R}\n${D} └──────────────────────────────────────────────────────────${R}\n\n${C} HEADINGS${R}\n${Y} # Heading 1${R}\n${Y} ## Heading 2${R}\n${Y} ### Heading 3${R}\n\n${C} TEXT FORMATTING${R}\n${Y} **bold text**${R}\n${Y} *italic text*${R}\n${Y} \\`inline code\\`${R}\n${Y} ~~strikethrough~~${R}\n\n${C} BULLET LIST${R}\n${Y} - Item one${R}\n${Y} - Item two${R}\n${Y} - Item three${R}\n\n${C} NUMBERED LIST${R}\n${Y} 1. First${R}\n${Y} 2. Second${R}\n${Y} 3. Third${R}\n\n${C} TODO TASKS${R}\n${Y} - [ ] Open task${R}\n${Y} - [x] Completed task${R}\n\n${C} BLOCKQUOTE${R}\n${Y} > Quoted text here${R}\n\n${C} DIVIDER${R}\n${Y} ---${R}\n\n${C} CODE BLOCK${R}\n${Y} \\`\\`\\`python${R}\n${Y} def hello():${R}\n${Y} print(\"Hello!\")${R}\n${Y} \\`\\`\\`${R}\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, sql, html, css, json, yaml, bash, ruby, swift, etc.${R}\n\n${C} MERMAID DIAGRAM${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A --> B --> C;${R}\n${Y} \\`\\`\\`${R}\n${D} Types: graph/flowchart, sequenceDiagram, classDiagram,${R}\n${D} erDiagram, stateDiagram, gantt, pie, gitGraph, mindmap${R}\n\n${C} MATH (LaTeX via KaTeX)${R}\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n${D} LaTeX: \\\\frac{a}{b} \\\\sqrt{x} \\\\sum_{i=1}^{n} \\\\int_0^1${R}\n${D} \\\\alpha \\\\beta \\\\pi \\\\infty \\\\text{label} x^{2} x_{i}${R}\n\n${C} CALLOUT${R}\n${Y} > [!info]${R}\n${Y} > Informational note${R}\n${D} Variants: info, warning, error, tip${R}\n${D} Multi-line: each line starts with > ${R}\n\n${C} QUERY BLOCK${R}\n${Y} > [!query]${R}\n${Y} > type:todo status:open #work${R}\n\n${C} INLINE LINK${R}\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Standard markdown link syntax.${R}\n\n${C} EMBED (link preview)${R}\n${Y} > [!embed]${R}\n${Y} > https://youtube.com/watch?v=ID${R}\n${D} YouTube → video player. Other URLs → preview card.${R}\n\n${C} IMAGE${R}\n${Y} ![description](https://url.com/image.png)${R}\n\n${C} FILE ATTACHMENT${R}\n${Y} > [!file]${R}\n${Y} > [filename.pdf](https://url.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 7. WIKI LINKS — HOW TO CONNECT NOTES${R}\n\n${D} Wiki links create connections between notes.${R}\n${D} They render as clickable purple links in the web app.${R}\n${D} The linked note shows a \"backlink\" at the bottom.${R}\n\n${Y} Check out [[Project Roadmap]] for details.${R}\n${Y} This connects to [[AI Research Notes]] and [[Meeting Notes]].${R}\n\n${D} Rules:${R}\n${D} • Use the exact note title inside [[ ]]${R}\n${D} • Case-insensitive: [[my note]] matches \"My Note\"${R}\n${D} • If the note doesn't exist yet, the link is still created${R}\n${D} • Multiple links in one paragraph is fine${R}\n${D} • Wiki links work in any text: paragraphs, todos, callouts${R}\n\n${D} Example: Create a network of linked notes${R}\n ${G}vertex new \"Hub Note\"${R}\n ${G}vertex edit \"Hub Note\"${R}\n${D} Then write:${R}\n${Y} # Hub Note${R}\n${Y} ${R}\n${Y} This connects to:${R}\n${Y} - [[Topic A]] — first topic${R}\n${Y} - [[Topic B]] — second topic${R}\n${Y} - [[Topic C]] — third topic${R}\n\n${C}${B} 8. TAGS — HOW THEY WORK${R}\n\n${D} Tags categorize content. They appear as purple pills in the web app.${R}\n${D} Tags are auto-created when you use them — no need to create first.${R}\n\n${C} Basic tags:${R}\n${Y} This paragraph has #work and #important tags.${R}\n${Y} - [x] Finish report #work #deadline${R}\n\n${C} Rules:${R}\n${D} • Must start with a letter: #valid, #tag123${R}\n${D} • Can contain letters, numbers, hyphens, underscores: #my-tag, #my_tag${R}\n${D} • NO spaces: #my tag is wrong → use #my-tag${R}\n${D} • Tags are case-insensitive: #Work = #work${R}\n${D} • Tags work everywhere: paragraphs, todos, headings, callouts${R}\n\n${C}${B} 9. TAG HIERARCHY — PARENT/CHILD RELATIONSHIPS${R}\n\n${D} Tags can have parent-child relationships using / separator.${R}\n${D} This creates a DAG (directed acyclic graph) of tags.${R}\n\n${Y} This is about #work/frontend${R} ${D}← creates: work → frontend${R}\n${Y} Also covers #work/backend${R} ${D}← creates: work → backend${R}\n${Y} Deep nesting: #cs/algo/sorting${R} ${D}← creates: cs → algo → sorting${R}\n\n${D} What happens:${R}\n${D} • Only the LEAF tag is applied to the block: \"frontend\" not \"work\"${R}\n${D} • Parent tags are auto-created if they don't exist${R}\n${D} • Parent→child edges are created in the tag hierarchy${R}\n${D} • Searching #work finds blocks tagged with #work AND all children${R}\n${D} (frontend, backend, etc.)${R}\n\n${D} You can also set relationships via command palette (Cmd+K in web):${R}\n${D} \"Tag Extend\" → pick parent and child tags${R}\n\n${C}${B} 10. SEARCH QUERY SYNTAX${R}\n\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#work\"${R} ${D}← all blocks tagged #work (+ children)${R}\n ${G}vertex search \"#work/frontend\"${R} ${D}← searches the leaf tag \"frontend\"${R}\n ${G}vertex search \"type:todo\"${R} ${D}← all todo blocks${R}\n ${G}vertex search \"type:code\"${R} ${D}← all code blocks${R}\n ${G}vertex search \"type:heading\"${R} ${D}← all headings${R}\n ${G}vertex search \"status:open\"${R} ${D}← unchecked todos${R}\n ${G}vertex search \"status:done\"${R} ${D}← checked todos${R}\n ${G}vertex search \"type:todo status:open #work\"${R} ${D}← combine filters${R}\n ${G}vertex search \"type:todo #work keyword\"${R} ${D}← all three${R}\n\n${C}${B} 11. DAILY NOTES${R}\n\n ${G}vertex daily${R} ${D}← view/create today's daily note${R}\n ${G}vertex daily --last${R} ${D}← view most recent daily (no create)${R}\n ${G}vertex today${R} ${D}← open latest daily in interactive TUI${R}\n\n${D} Daily notes are auto-titled with the date: \"April 14, 2026\"${R}\n${D} One daily note per day — calling vertex daily twice won't duplicate.${R}\n\n${C}${B} 12. INTERACTIVE MODE${R}\n\n ${G}vertex interactive \"Note Title\"${R} ${D}← open any note${R}\n ${G}vertex today${R} ${D}← shortcut for latest daily${R}\n\n${D} Controls:${R}\n${D} ↑ ↓ Move cursor between items${R}\n${D} Enter Toggle todo done/undone${R}\n${D} t Add new todo${R}\n${D} n Add new text line${R}\n${D} d Delete item at cursor${R}\n${D} e Open in $EDITOR for full editing${R}\n${D} s Save changes${R}\n${D} q Save and quit${R}\n\n${C}${B} 13. TRASH & DELETE${R}\n\n ${G}vertex delete \"Note\"${R} ${D}← soft delete (recoverable)${R}\n ${G}vertex trash${R} ${D}← list trashed notes${R}\n ${G}vertex restore \"Note\"${R} ${D}← restore from trash${R}\n ${G}vertex trash:empty${R} ${D}← permanent delete all (irreversible)${R}\n\n${D} Soft delete: note goes to trash, can be restored${R}\n${D} Hard delete (trash:empty): note + files + tags permanently removed${R}\n\n${C}${B} 14. ALL COMMANDS REFERENCE${R}\n\n ${G}vertex login${R} ${D}← authenticate (GitHub/Google/Email)${R}\n ${G}vertex logout${R} ${D}← clear session${R}\n ${G}vertex whoami${R} ${D}← show logged-in user${R}\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex new [title]${R} ${D}← create note${R}\n ${G}vertex view <title>${R} ${D}← view as markdown${R}\n ${G}vertex edit <title>${R} ${D}← edit in $EDITOR${R}\n ${G}vertex daily${R} ${D}← today's daily note${R}\n ${G}vertex daily --last${R} ${D}← latest daily note${R}\n ${G}vertex today${R} ${D}← latest daily → interactive${R}\n ${G}vertex interactive <title>${R} ${D}← interactive TUI mode${R}\n ${G}vertex capture \"text\"${R} ${D}← quick capture to inbox${R}\n ${G}vertex search <query>${R} ${D}← search notes${R}\n ${G}vertex tags${R} ${D}← list tags${R}\n ${G}vertex import <file.md>${R} ${D}← import markdown as note${R}\n ${G}vertex import <file> -t \"T\"${R} ${D}← import with title${R}\n ${G}vertex export <title>${R} ${D}← export as markdown${R}\n ${G}vertex export <title> -o file${R} ${D}← export to file${R}\n ${G}vertex export <title> --json${R} ${D}← export as JSON${R}\n ${G}vertex delete <title>${R} ${D}← soft delete${R}\n ${G}vertex restore <title>${R} ${D}← restore from trash${R}\n ${G}vertex trash${R} ${D}← list trash${R}\n ${G}vertex trash:empty${R} ${D}← empty trash permanently${R}\n ${G}vertex status${R} ${D}← storage, note count, version${R}\n ${G}vertex syntax${R} ${D}← markdown syntax reference${R}\n ${G}vertex howto${R} ${D}← this guide${R}\n ${G}vertex help${R} ${D}← command overview${R}\n\n${C}${B} 15. FULL EXAMPLE — AI CREATING A COMPLETE NOTE${R}\n${D} ──────────────────────────────────────────────────────────────${R}\n\n ${G}cat > /tmp/my-note.md << 'VERTEX'${R}\n ${Y}# Distributed Systems Study Guide${R}\n ${Y}${R}\n ${Y}Notes from studying distributed systems. #learning #cs${R}\n ${Y}${R}\n ${Y}## CAP Theorem${R}\n ${Y}${R}\n ${Y}A distributed system can only guarantee 2 of 3:${R}\n ${Y}${R}\n ${Y}- **Consistency** — every read gets the latest write${R}\n ${Y}- **Availability** — every request gets a response${R}\n ${Y}- **Partition tolerance** — system works despite network failures${R}\n ${Y}${R}\n ${Y}> [!warning]${R}\n ${Y}> In practice, P is non-negotiable. You choose between CP and AP.${R}\n ${Y}${R}\n ${Y}## Consensus Algorithm${R}\n ${Y}${R}\n ${Y}\\`\\`\\`mermaid${R}\n ${Y}sequenceDiagram${R}\n ${Y} Leader->>Follower1: AppendEntries${R}\n ${Y} Leader->>Follower2: AppendEntries${R}\n ${Y} Follower1-->>Leader: ACK${R}\n ${Y} Follower2-->>Leader: ACK${R}\n ${Y} Leader->>Leader: Commit (majority ACK)${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Consistency Models${R}\n ${Y}${R}\n ${Y}$$${R}\n ${Y}\\\\text{Linearizability} \\\\subset \\\\text{Sequential} \\\\subset \\\\text{Causal} \\\\subset \\\\text{Eventual}${R}\n ${Y}$$${R}\n ${Y}${R}\n ${Y}## Implementation${R}\n ${Y}${R}\n ${Y}\\`\\`\\`go${R}\n ${Y}type RaftNode struct {${R}\n ${Y} state State${R}\n ${Y} term int${R}\n ${Y} votedFor string${R}\n ${Y} log []Entry${R}\n ${Y}}${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Reading List${R}\n ${Y}${R}\n ${Y}- [x] Designing Data-Intensive Applications #learning/books${R}\n ${Y}- [ ] Raft paper #learning/papers${R}\n ${Y}- [ ] Paxos Made Simple #learning/papers${R}\n ${Y}${R}\n ${Y}> [!tip]${R}\n ${Y}> Start with Raft — it's simpler than Paxos and used in etcd.${R}\n ${Y}${R}\n ${Y}---${R}\n ${Y}${R}\n ${Y}Related: [[Project Roadmap]] · [[AI Research Notes]]${R}\n ${G}VERTEX${R}\n\n ${G}vertex import /tmp/my-note.md -t \"Distributed Systems Study Guide\"${R}\n\n${D} ──────────────────────────────────────────────────────────────${R}\n${D} This creates a note with: heading, bullets, callouts, mermaid,${R}\n${D} math, code, todos with scoped tags, wiki links, and a divider.${R}\n${D} Open the web app to see it rendered with rich blocks.${R}\n`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,39 @@
1
+ import {
2
+ getClient,
3
+ getUserId
4
+ } from "../chunk-XGZKUOFI.js";
5
+ import "../chunk-PBF5EE4Y.js";
6
+ import {
7
+ createNote,
8
+ markdownToTiptap,
9
+ saveNoteContent
10
+ } from "../chunk-WM6QVD53.js";
11
+
12
+ // src/commands/import.ts
13
+ import { Command, Args, Flags } from "@oclif/core";
14
+ import { readFileSync } from "fs";
15
+ import { basename } from "path";
16
+ var Import = class _Import extends Command {
17
+ static description = "Import a markdown file as a note";
18
+ static args = {
19
+ file: Args.string({ description: "Path to .md file", required: true })
20
+ };
21
+ static flags = {
22
+ title: Flags.string({ char: "t", description: "Note title (default: filename)" })
23
+ };
24
+ async run() {
25
+ const { args, flags } = await this.parse(_Import);
26
+ const client = await getClient();
27
+ const userId = await getUserId();
28
+ const md = readFileSync(args.file, "utf-8");
29
+ const title = flags.title ?? basename(args.file, ".md");
30
+ const tiptapJson = markdownToTiptap(md);
31
+ const note = await createNote(client, { user_id: userId, title });
32
+ await saveNoteContent(client, note.id, userId, tiptapJson);
33
+ this.log(`Imported: ${title} (${note.id})`);
34
+ }
35
+ };
36
+ export {
37
+ Import as default
38
+ };
39
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/import.ts"],"sourcesContent":["import { Command, Args, Flags } from \"@oclif/core\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { createNote, saveNoteContent } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\nimport { markdownToTiptap } from \"@vertex/core\";\n\nexport default class Import extends Command {\n static override description = \"Import a markdown file as a note\";\n\n static override args = {\n file: Args.string({ description: \"Path to .md file\", required: true }),\n };\n\n static override flags = {\n title: Flags.string({ char: \"t\", description: \"Note title (default: filename)\" }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Import);\n const client = await getClient();\n const userId = await getUserId();\n\n const md = readFileSync(args.file, \"utf-8\");\n const title = flags.title ?? basename(args.file, \".md\");\n const tiptapJson = markdownToTiptap(md);\n\n const note = await createNote(client, { user_id: userId, title });\n await saveNoteContent(client, note.id, userId, tiptapJson);\n\n this.log(`Imported: ${title} (${note.id})`);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,SAAS,MAAM,aAAa;AACrC,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAKzB,IAAqB,SAArB,MAAqB,gBAAe,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,oBAAoB,UAAU,KAAK,CAAC;AAAA,EACvE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,iCAAiC,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,OAAM;AAC/C,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAE/B,UAAM,KAAK,aAAa,KAAK,MAAM,OAAO;AAC1C,UAAM,QAAQ,MAAM,SAAS,SAAS,KAAK,MAAM,KAAK;AACtD,UAAM,aAAa,iBAAiB,EAAE;AAEtC,UAAM,OAAO,MAAM,WAAW,QAAQ,EAAE,SAAS,QAAQ,MAAM,CAAC;AAChE,UAAM,gBAAgB,QAAQ,KAAK,IAAI,QAAQ,UAAU;AAEzD,SAAK,IAAI,aAAa,KAAK,KAAK,KAAK,EAAE,GAAG;AAAA,EAC5C;AACF;","names":[]}
@@ -1,16 +1,32 @@
1
1
  import {
2
2
  getClient,
3
3
  getUserId
4
- } from "../chunk-DDFOKGIX.js";
4
+ } from "../chunk-XGZKUOFI.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-4QLCD6TZ.js";
12
+ } from "../chunk-WM6QVD53.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
- if (type === "taskList") {
25
- const children = tiptap.content ?? [];
26
- for (const child of children) {
27
- const attrs = child.attrs ?? {};
28
- const checked = attrs.checked === true;
29
- const text = extractText(child);
30
- items.push({ kind: "todo", text, checked });
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 extractText(node) {
40
- if (typeof node.text === "string") return node.text;
41
- const content = node.content;
42
- if (!content) return "";
43
- return content.map(extractText).join("");
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(`\x1B[1m ${noteTitle}\x1B[0m
135
+ process.stdout.write(`${BOLD} ${noteTitle}${R}
77
136
  `);
78
- process.stdout.write(`\x1B[90m \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\x1B[0m
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
- const item = items[i];
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(" \x1B[90m(empty)\x1B[0m\n");
144
+ process.stdout.write(` ${DIM}(empty)${R}
145
+ `);
97
146
  }
98
147
  process.stdout.write(`
99
- \x1B[90m \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\x1B[0m
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(` \x1B[33mNew todo:\x1B[0m ${inputBuffer}\x1B[7m \x1B[0m
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(` \x1B[33mNew text:\x1B[0m ${inputBuffer}\x1B[7m \x1B[0m
154
+ process.stdout.write(` ${YELLOW}New text:${R} ${inputBuffer}\x1B[7m \x1B[0m
106
155
  `);
107
156
  } else {
108
- process.stdout.write(" \x1B[90m\u2191\u2193 move Enter toggle t new todo n new text d delete s save q quit\x1B[0m\n");
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
- const items = blocksToItems(blocks);
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 tiptap = itemsToTiptap(items);
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 `![](${item.text})`;
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(" \x1B[32mSaved!\x1B[0m\n");
308
+ process.stdout.write(` ${GREEN}Saved!${R}
309
+ `);
192
310
  return;
193
311
  } else if (key === "q" || key === "") {
194
- if (dirty) {
195
- await save();
196
- cleanup();
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 `![](${item.text})`;\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":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-PBF5EE4Y.js";
5
5
  import {
6
6
  createSupabaseClient
7
- } from "../chunk-4QLCD6TZ.js";
7
+ } from "../chunk-WM6QVD53.js";
8
8
 
9
9
  // src/commands/login.ts
10
10
  import { Command } from "@oclif/core";
@@ -124,8 +124,12 @@ var Login = class extends Command {
124
124
  options: { redirectTo: redirectUrl, skipBrowserRedirect: false }
125
125
  }).then(({ data }) => {
126
126
  if (data.url) {
127
+ console.log(`
128
+ If browser doesn't open, visit:
129
+ ${data.url}
130
+ `);
127
131
  import("child_process").then(({ exec }) => {
128
- const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
132
+ const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? 'start ""' : "xdg-open";
129
133
  exec(`${cmd} "${data.url}"`);
130
134
  });
131
135
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { createServer } from \"node:http\";\nimport { createInterface } from \"node:readline\";\nimport { createSupabaseClient } from \"@vertex/core\";\nimport { loadConfig, saveConfig } from \"../lib/config.js\";\n\nexport default class Login extends Command {\n static override description = \"Log in to Vertex\";\n\n async run(): Promise<void> {\n const config = loadConfig();\n\n this.log(\"\\n How would you like to log in?\\n\");\n this.log(\" 1) GitHub\");\n this.log(\" 2) Google\");\n this.log(\" 3) Email & Password\\n\");\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const choice = await new Promise<string>((resolve) => {\n rl.question(\" Choice (1/2/3): \", (ans) => { rl.close(); resolve(ans.trim()); });\n });\n\n if (choice === \"3\") {\n await this.emailLogin(config);\n return;\n }\n\n const provider = choice === \"2\" ? \"google\" : \"github\";\n await this.oauthLogin(config, provider);\n }\n\n private async emailLogin(config: ReturnType<typeof loadConfig>): Promise<void> {\n const rl1 = createInterface({ input: process.stdin, output: process.stdout });\n const email = await new Promise<string>((resolve) => {\n rl1.question(\" Email: \", (ans) => { rl1.close(); resolve(ans.trim()); });\n });\n\n const rl2 = createInterface({ input: process.stdin, output: process.stdout });\n const password = await new Promise<string>((resolve) => {\n rl2.question(\" Password: \", (ans) => { rl2.close(); resolve(ans.trim()); });\n });\n\n const rl3 = createInterface({ input: process.stdin, output: process.stdout });\n const isSignup = await new Promise<string>((resolve) => {\n rl3.question(\" Sign in or sign up? (in/up): \", (ans) => { rl3.close(); resolve(ans.trim().toLowerCase()); });\n });\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n\n if (isSignup === \"up\") {\n const { error } = await client.auth.signUp({ email, password });\n if (error) {\n this.error(`Sign up failed: ${error.message}`);\n }\n this.log(\" Check your email to confirm your account, then run: vertex login\");\n process.exit(0);\n }\n\n const { data, error } = await client.auth.signInWithPassword({ email, password });\n if (error) {\n this.error(`Login failed: ${error.message}`);\n }\n\n if (data.session) {\n saveConfig({\n accessToken: data.session.access_token,\n refreshToken: data.session.refresh_token,\n userId: data.session.user.id,\n email: data.session.user.email,\n });\n this.log(` Logged in as ${data.session.user.email}`);\n }\n process.exit(0);\n }\n\n private async oauthLogin(config: ReturnType<typeof loadConfig>, provider: \"github\" | \"google\"): Promise<void> {\n const port = 54321;\n const redirectUrl = `http://localhost:${port}/callback`;\n\n this.log(` Opening browser for ${provider} login...`);\n\n const tokenPromise = new Promise<{ access_token: string; refresh_token: string }>((resolve, reject) => {\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n\n if (url.pathname === \"/callback\") {\n const accessToken = url.searchParams.get(\"access_token\");\n const refreshToken = url.searchParams.get(\"refresh_token\");\n\n if (accessToken && refreshToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Logged in! You can close this tab.</h2>\");\n server.close();\n resolve({ access_token: accessToken, refresh_token: refreshToken });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n <html><body>\n <script>\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const at = params.get(\"access_token\");\n const rt = params.get(\"refresh_token\");\n if (at && rt) {\n window.location.href = \"/callback?access_token=\" + encodeURIComponent(at) + \"&refresh_token=\" + encodeURIComponent(rt);\n } else {\n document.body.innerHTML = \"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Login failed. Try again.</h2>\";\n }\n </script>\n <h2 style=\"font-family:sans-serif;text-align:center;margin-top:40vh\">Completing login...</h2>\n </body></html>\n `);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n server.listen(port, () => {\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n client.auth.signInWithOAuth({\n provider,\n options: { redirectTo: redirectUrl, skipBrowserRedirect: false },\n }).then(({ data }) => {\n if (data.url) {\n import(\"node:child_process\").then(({ exec }) => {\n const cmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${cmd} \"${data.url}\"`);\n });\n }\n });\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error(\"Login timed out after 120 seconds\"));\n }, 120_000);\n });\n\n try {\n const tokens = await tokenPromise;\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n const { data } = await client.auth.setSession({\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n });\n\n saveConfig({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n userId: data.session?.user.id,\n email: data.session?.user.email,\n });\n\n this.log(` Logged in as ${data.session?.user.email ?? \"unknown\"}`);\n process.exit(0);\n } catch (err) {\n this.error(`Login failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n}\n"],"mappings":"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","names":["error"]}
1
+ {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { createServer } from \"node:http\";\nimport { createInterface } from \"node:readline\";\nimport { createSupabaseClient } from \"@vertex/core\";\nimport { loadConfig, saveConfig } from \"../lib/config.js\";\n\nexport default class Login extends Command {\n static override description = \"Log in to Vertex\";\n\n async run(): Promise<void> {\n const config = loadConfig();\n\n this.log(\"\\n How would you like to log in?\\n\");\n this.log(\" 1) GitHub\");\n this.log(\" 2) Google\");\n this.log(\" 3) Email & Password\\n\");\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const choice = await new Promise<string>((resolve) => {\n rl.question(\" Choice (1/2/3): \", (ans) => { rl.close(); resolve(ans.trim()); });\n });\n\n if (choice === \"3\") {\n await this.emailLogin(config);\n return;\n }\n\n const provider = choice === \"2\" ? \"google\" : \"github\";\n await this.oauthLogin(config, provider);\n }\n\n private async emailLogin(config: ReturnType<typeof loadConfig>): Promise<void> {\n const rl1 = createInterface({ input: process.stdin, output: process.stdout });\n const email = await new Promise<string>((resolve) => {\n rl1.question(\" Email: \", (ans) => { rl1.close(); resolve(ans.trim()); });\n });\n\n const rl2 = createInterface({ input: process.stdin, output: process.stdout });\n const password = await new Promise<string>((resolve) => {\n rl2.question(\" Password: \", (ans) => { rl2.close(); resolve(ans.trim()); });\n });\n\n const rl3 = createInterface({ input: process.stdin, output: process.stdout });\n const isSignup = await new Promise<string>((resolve) => {\n rl3.question(\" Sign in or sign up? (in/up): \", (ans) => { rl3.close(); resolve(ans.trim().toLowerCase()); });\n });\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n\n if (isSignup === \"up\") {\n const { error } = await client.auth.signUp({ email, password });\n if (error) {\n this.error(`Sign up failed: ${error.message}`);\n }\n this.log(\" Check your email to confirm your account, then run: vertex login\");\n process.exit(0);\n }\n\n const { data, error } = await client.auth.signInWithPassword({ email, password });\n if (error) {\n this.error(`Login failed: ${error.message}`);\n }\n\n if (data.session) {\n saveConfig({\n accessToken: data.session.access_token,\n refreshToken: data.session.refresh_token,\n userId: data.session.user.id,\n email: data.session.user.email,\n });\n this.log(` Logged in as ${data.session.user.email}`);\n }\n process.exit(0);\n }\n\n private async oauthLogin(config: ReturnType<typeof loadConfig>, provider: \"github\" | \"google\"): Promise<void> {\n const port = 54321;\n const redirectUrl = `http://localhost:${port}/callback`;\n\n this.log(` Opening browser for ${provider} login...`);\n\n const tokenPromise = new Promise<{ access_token: string; refresh_token: string }>((resolve, reject) => {\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n\n if (url.pathname === \"/callback\") {\n const accessToken = url.searchParams.get(\"access_token\");\n const refreshToken = url.searchParams.get(\"refresh_token\");\n\n if (accessToken && refreshToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Logged in! You can close this tab.</h2>\");\n server.close();\n resolve({ access_token: accessToken, refresh_token: refreshToken });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n <html><body>\n <script>\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const at = params.get(\"access_token\");\n const rt = params.get(\"refresh_token\");\n if (at && rt) {\n window.location.href = \"/callback?access_token=\" + encodeURIComponent(at) + \"&refresh_token=\" + encodeURIComponent(rt);\n } else {\n document.body.innerHTML = \"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Login failed. Try again.</h2>\";\n }\n </script>\n <h2 style=\"font-family:sans-serif;text-align:center;margin-top:40vh\">Completing login...</h2>\n </body></html>\n `);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n server.listen(port, () => {\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n client.auth.signInWithOAuth({\n provider,\n options: { redirectTo: redirectUrl, skipBrowserRedirect: false },\n }).then(({ data }) => {\n if (data.url) {\n console.log(`\\n If browser doesn't open, visit:\\n ${data.url}\\n`);\n import(\"node:child_process\").then(({ exec }) => {\n const cmd = process.platform === \"darwin\" ? \"open\"\n : process.platform === \"win32\" ? 'start \"\"'\n : \"xdg-open\";\n exec(`${cmd} \"${data.url}\"`);\n });\n }\n });\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error(\"Login timed out after 120 seconds\"));\n }, 120_000);\n });\n\n try {\n const tokens = await tokenPromise;\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n const { data } = await client.auth.setSession({\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n });\n\n saveConfig({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n userId: data.session?.user.id,\n email: data.session?.user.email,\n });\n\n this.log(` Logged in as ${data.session?.user.email ?? \"unknown\"}`);\n process.exit(0);\n } catch (err) {\n this.error(`Login failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n}\n"],"mappings":"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","names":["error"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getClient,
3
3
  getUserId
4
- } from "../chunk-DDFOKGIX.js";
4
+ } from "../chunk-XGZKUOFI.js";
5
5
  import "../chunk-PBF5EE4Y.js";
6
6
  import {
7
7
  createNote
8
- } from "../chunk-4QLCD6TZ.js";
8
+ } from "../chunk-WM6QVD53.js";
9
9
 
10
10
  // src/commands/new.ts
11
11
  import { Command, Args } from "@oclif/core";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getClient,
3
3
  getUserId
4
- } from "../chunk-DDFOKGIX.js";
4
+ } from "../chunk-XGZKUOFI.js";
5
5
  import "../chunk-PBF5EE4Y.js";
6
6
  import {
7
7
  listNotes
8
- } from "../chunk-4QLCD6TZ.js";
8
+ } from "../chunk-WM6QVD53.js";
9
9
 
10
10
  // src/commands/notes.ts
11
11
  import { Command } from "@oclif/core";