Local-first knowledge management system with BYO API keys. Features: - 3-panel UI (Nodes | Focus | Helpers) - SQLite + sqlite-vec for vector search - Agent system (Easy/Hard mode orchestrators) - Content extraction (YouTube, PDF, web) - Integrate workflow for connection discovery - Dimension system with auto-assignment Tech stack: - Next.js 15 + TypeScript + Tailwind CSS - Anthropic (Claude) + OpenAI (GPT) via Vercel AI SDK Setup: npm install && npm rebuild better-sqlite3 scripts/dev/bootstrap-local.sh npm run dev MIT License
174 lines
4.4 KiB
TypeScript
174 lines
4.4 KiB
TypeScript
// New Node-based type system replacing rigid Item categorization
|
|
export interface Node {
|
|
id: number;
|
|
title: string;
|
|
description?: string;
|
|
content?: string; // Consolidated content from description + abstract + notes
|
|
link?: string;
|
|
type?: string;
|
|
dimensions: string[]; // Flexible dimensions replacing type + stage + segment + tags
|
|
embedding?: Buffer; // Node-level embedding (BLOB data)
|
|
chunk?: string;
|
|
metadata?: any; // Flexible metadata storage from extras + chunk_status + sub_type
|
|
created_at: string;
|
|
updated_at: string;
|
|
is_pinned?: number; // Legacy pin flag (read-only, slated for removal)
|
|
edge_count?: number; // Derived count of edges, included in some queries
|
|
|
|
// Optional embedding fields (restored from migration)
|
|
embedding_updated_at?: string;
|
|
embedding_text?: string;
|
|
chunk_status?: 'not_chunked' | 'chunking' | 'chunked' | 'error' | null;
|
|
}
|
|
|
|
// Legacy Item interface - DEPRECATED, use Node instead
|
|
// Kept temporarily for migration compatibility
|
|
export interface Item extends Node {
|
|
// Legacy fields for backwards compatibility during transition
|
|
description?: string;
|
|
abstract?: string;
|
|
type?: string;
|
|
legacyType?: string[];
|
|
stage?: string;
|
|
segment?: string[];
|
|
tags?: string[];
|
|
sub_type?: any;
|
|
notes?: any;
|
|
extras?: any;
|
|
score?: number;
|
|
content_embedding?: number[];
|
|
embedding_updated_at?: string;
|
|
chunk_status?: 'not_chunked' | 'chunking' | 'chunked' | 'error';
|
|
chunk_updated_at?: string;
|
|
}
|
|
|
|
export interface Chunk {
|
|
id: number;
|
|
node_id: number; // Updated from item_id to node_id
|
|
chunk_idx?: number;
|
|
text: string;
|
|
embedding?: number[];
|
|
embedding_type: string;
|
|
metadata?: any; // Updated from extras to metadata
|
|
created_at: string;
|
|
}
|
|
|
|
export interface Edge {
|
|
id: number;
|
|
from_node_id: number;
|
|
to_node_id: number;
|
|
context?: any;
|
|
source: 'user' | 'ai_similarity' | 'helper_name';
|
|
created_at: string;
|
|
}
|
|
|
|
export interface Chat {
|
|
id: number;
|
|
user_message?: string;
|
|
assistant_message?: string;
|
|
thread_id: string;
|
|
focused_node_id?: number; // Updated from focused_item_id
|
|
metadata?: any;
|
|
embedding?: number[]; // Renamed from content_embedding
|
|
created_at: string;
|
|
}
|
|
|
|
export interface SessionContext {
|
|
id: number;
|
|
session_id: string;
|
|
focused_node_id: number; // Updated from focused_item_id
|
|
context_data: any;
|
|
created_at: string;
|
|
last_accessed: string;
|
|
expires_at: string;
|
|
}
|
|
|
|
export interface SessionCache {
|
|
id: number;
|
|
session_id: string;
|
|
cache_key: string;
|
|
cache_data: any;
|
|
expires_at: string;
|
|
created_at: string;
|
|
}
|
|
|
|
// New NodeFilters interface replacing rigid ItemFilters
|
|
export interface NodeFilters {
|
|
dimensions?: string[]; // Filter by dimensions (replaces stage/type filtering)
|
|
search?: string; // Text search in title/content
|
|
limit?: number;
|
|
offset?: number;
|
|
sortBy?: 'updated' | 'edges'; // Sort by updated_at or edge count
|
|
}
|
|
|
|
// Legacy filters - DEPRECATED, use NodeFilters instead
|
|
export interface ItemFilters extends NodeFilters {
|
|
stage?: string;
|
|
type?: string;
|
|
tags?: string[];
|
|
}
|
|
|
|
export interface ChunkData {
|
|
node_id: number; // Updated from item_id
|
|
chunk_idx?: number;
|
|
text: string;
|
|
embedding?: number[];
|
|
embedding_type: string;
|
|
metadata?: any; // Updated from extras
|
|
}
|
|
|
|
export interface EdgeData {
|
|
from_node_id: number;
|
|
to_node_id: number;
|
|
context?: any;
|
|
source: 'user' | 'ai_similarity' | 'helper_name';
|
|
}
|
|
|
|
export interface ChatData {
|
|
user_message?: string;
|
|
assistant_message?: string;
|
|
thread_id: string;
|
|
focused_node_id?: number; // Updated from focused_item_id
|
|
metadata?: any;
|
|
embedding?: number[]; // Renamed from content_embedding
|
|
}
|
|
|
|
export interface CachedContext {
|
|
sessionId: string;
|
|
focusedNodeId: number; // Updated from focusedItemId
|
|
contextData: any;
|
|
expiresAt: string;
|
|
}
|
|
|
|
// New NodeConnection interface
|
|
export interface NodeConnection {
|
|
id: number;
|
|
connected_node: Node; // Updated from connected_item
|
|
edge: Edge;
|
|
}
|
|
|
|
// Legacy connection - DEPRECATED, use NodeConnection instead
|
|
export interface ItemConnection {
|
|
id: number;
|
|
connected_item: Item;
|
|
edge: Edge;
|
|
}
|
|
|
|
export interface DatabaseConfig {
|
|
host: string;
|
|
port: number;
|
|
database: string;
|
|
user: string;
|
|
password: string;
|
|
ssl?: boolean;
|
|
connectionTimeoutMillis?: number;
|
|
idleTimeoutMillis?: number;
|
|
max?: number;
|
|
}
|
|
|
|
export interface DatabaseError {
|
|
message: string;
|
|
code?: string;
|
|
details?: any;
|
|
}
|