Backlinks previously relied on scanning allContent (raw markdown), which was empty in Tauri mode until notes were explicitly saved. Now outgoing wikilink targets are extracted during Rust vault scan and stored on VaultEntry. The frontend useBacklinks hook uses this indexed data, and outgoingLinks update in real-time on content change. - Add extract_outgoing_links() in Rust parsing + outgoing_links field on VaultEntry - Add extractOutgoingLinks() TypeScript utility for real-time updates - Rewrite useBacklinks to use outgoingLinks instead of scanning raw content - Add cache version invalidation to force rescan on format change - Extract useEditorSaveWithLinks hook to keep App.tsx under code health threshold Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
107 lines
2.6 KiB
TypeScript
107 lines
2.6 KiB
TypeScript
export interface VaultEntry {
|
|
path: string
|
|
filename: string
|
|
title: string
|
|
isA: string | null
|
|
aliases: string[]
|
|
belongsTo: string[]
|
|
relatedTo: string[]
|
|
status: string | null
|
|
owner: string | null
|
|
cadence: string | null
|
|
archived: boolean
|
|
trashed: boolean
|
|
trashedAt: number | null
|
|
modifiedAt: number | null
|
|
createdAt: number | null
|
|
fileSize: number
|
|
snippet: string
|
|
/** Generic relationship fields: any frontmatter key whose value contains wikilinks. */
|
|
relationships: Record<string, string[]>
|
|
/** Phosphor icon name (kebab-case) for Type entries, e.g. "cooking-pot" */
|
|
icon: string | null
|
|
/** Accent color key for Type entries: "red" | "purple" | "blue" | "green" | "yellow" | "orange" */
|
|
color: string | null
|
|
/** Display order for Type entries in sidebar (lower = higher). null = use default order. */
|
|
order: number | null
|
|
/** All wikilink targets found in the note content. Extracted from [[target]] patterns. */
|
|
outgoingLinks: string[]
|
|
}
|
|
|
|
export type NoteStatus = 'new' | 'modified' | 'clean'
|
|
|
|
export interface GitCommit {
|
|
hash: string
|
|
shortHash: string
|
|
message: string
|
|
author: string
|
|
date: number // unix timestamp
|
|
}
|
|
|
|
export interface ModifiedFile {
|
|
path: string
|
|
relativePath: string
|
|
status: 'modified' | 'added' | 'deleted' | 'untracked' | 'renamed'
|
|
}
|
|
|
|
export interface Settings {
|
|
anthropic_key: string | null
|
|
openai_key: string | null
|
|
google_key: string | null
|
|
github_token: string | null
|
|
github_username: string | null
|
|
}
|
|
|
|
export interface DeviceFlowStart {
|
|
device_code: string
|
|
user_code: string
|
|
verification_uri: string
|
|
expires_in: number
|
|
interval: number
|
|
}
|
|
|
|
export interface DeviceFlowPollResult {
|
|
status: 'pending' | 'complete' | 'expired' | 'error'
|
|
access_token: string | null
|
|
error: string | null
|
|
}
|
|
|
|
export interface GitHubUser {
|
|
login: string
|
|
name: string | null
|
|
avatar_url: string
|
|
}
|
|
|
|
export interface GithubRepo {
|
|
name: string
|
|
full_name: string
|
|
description: string | null
|
|
private: boolean
|
|
clone_url: string
|
|
html_url: string
|
|
updated_at: string | null
|
|
}
|
|
|
|
export interface SearchResult {
|
|
title: string
|
|
path: string
|
|
snippet: string
|
|
score: number
|
|
noteType: string | null
|
|
}
|
|
|
|
export interface SearchResponse {
|
|
results: SearchResult[]
|
|
elapsedMs: number
|
|
query: string
|
|
mode: string
|
|
}
|
|
|
|
export type SearchMode = 'keyword' | 'semantic' | 'hybrid'
|
|
|
|
export type SidebarSelection =
|
|
| { kind: 'filter'; filter: 'all' | 'favorites' | 'archived' | 'trash' | 'changes' }
|
|
| { kind: 'sectionGroup'; type: string }
|
|
| { kind: 'entity'; entry: VaultEntry }
|
|
| { kind: 'topic'; entry: VaultEntry }
|