botchan 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/config.ts","../../src/utils/wallet.ts","../../src/utils/output.ts","../../src/utils/encode.ts","../../src/utils/client.ts","../../src/utils/postId.ts","../../src/utils/state.ts","../../src/utils/index.ts","../../src/tui/hooks/useFeedData.ts","../../src/tui/hooks/useKeyboard.ts","../../src/tui/hooks/useViewport.ts","../../src/tui/hooks/index.ts","../../src/tui/components/FeedList.tsx","../../src/tui/components/PostList.tsx","../../src/tui/components/CommentTree.tsx","../../src/tui/components/Profile.tsx","../../src/tui/components/Header.tsx","../../src/tui/components/StatusBar.tsx","../../src/tui/components/PostInput.tsx","../../src/tui/components/SenderFilter.tsx","../../src/tui/components/FeedSearch.tsx","../../src/tui/components/Help.tsx","../../src/tui/components/index.ts","../../src/tui/App.tsx","../../src/tui/index.tsx","../../src/commands/feeds.ts","../../src/commands/read.ts","../../src/commands/comments.ts","../../src/commands/profile.ts","../../src/commands/register.ts","../../src/commands/post.ts","../../src/commands/comment.ts","../../src/commands/config.ts","../../src/cli/index.ts"],"names":["chalk","FeedRegistryClient","FeedClient","NetClient","NULL_ADDRESS","useState","useRef","useCallback","useEffect","truncateAddress","formatTimestamp","jsx","Box","Text","jsxs","useStdout","React","isAddress","formatFeedName","useInput","program","senderNote","client","txConfig","MAX_MESSAGE_LENGTH","require","launchTui"],"mappings":"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","file":"index.mjs","sourcesContent":["import chalk from \"chalk\";\n\n/**\n * Default chain ID (Base mainnet)\n */\nexport const DEFAULT_CHAIN_ID = 8453;\n\n/**\n * Normalize a feed name to lowercase for consistency.\n */\nexport function normalizeFeedName(feed: string): string {\n return feed.toLowerCase();\n}\n\n/**\n * Common options shared across all CLI commands\n */\nexport interface CommonOptions {\n privateKey: `0x${string}`;\n chainId: number;\n rpcUrl?: string;\n}\n\n/**\n * Read-only options for commands that don't need a private key\n */\nexport interface ReadOnlyOptions {\n chainId: number;\n rpcUrl?: string;\n}\n\n/**\n * Get chain ID from option or environment variable\n */\nfunction getChainId(optionValue?: number): number {\n if (optionValue) {\n return optionValue;\n }\n\n const envChainId =\n process.env.BOTCHAN_CHAIN_ID || process.env.NET_CHAIN_ID;\n\n if (envChainId) {\n return parseInt(envChainId, 10);\n }\n\n return DEFAULT_CHAIN_ID;\n}\n\n/**\n * Get RPC URL from option or environment variable\n */\nfunction getRpcUrl(optionValue?: string): string | undefined {\n return optionValue || process.env.BOTCHAN_RPC_URL || process.env.NET_RPC_URL;\n}\n\n/**\n * Parse and validate read-only options for commands that don't need a private key.\n * Extracts chain ID and RPC URL from command options or environment variables.\n */\nexport function parseReadOnlyOptions(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse and validate common options shared across all commands.\n * Extracts private key, chain ID, and RPC URL from command options or environment variables.\n * @param options - Command options\n * @param supportsEncodeOnly - If true, mention --encode-only in error messages as an alternative\n */\nexport function parseCommonOptions(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.BOTCHAN_PRIVATE_KEY ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or BOTCHAN_PRIVATE_KEY/NET_PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using BOTCHAN_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n","import { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Create a wallet client from a private key\n */\nexport function createWallet(\n privateKey: `0x${string}`,\n chainId: number,\n rpcUrl?: string\n) {\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId,\n rpcUrl: rpcUrl,\n });\n\n return createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n}\n\n/**\n * Execute a transaction using a wallet client\n */\nexport async function executeTransaction(\n walletClient: ReturnType<typeof createWallet>,\n txConfig: WriteTransactionConfig\n): Promise<`0x${string}`> {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n chain: null,\n } as Parameters<typeof walletClient.writeContract>[0]);\n\n return hash;\n}\n","import chalk from \"chalk\";\nimport type { NetMessage, RegisteredFeed } from \"@net-protocol/feeds\";\n\n/**\n * Truncate an address for display\n */\nexport function truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Format a timestamp as ISO date string\n */\nexport function formatTimestamp(timestamp: number | bigint): string {\n return new Date(Number(timestamp) * 1000).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\n/** Parse topic to get clean feed name and whether it's a comment */\nfunction parseTopic(topic: string): { feedName: string; isComment: boolean } {\n const commentMatch = topic.match(/^(.+?):comments:/);\n if (commentMatch) {\n return { feedName: commentMatch[1], isComment: true };\n }\n return { feedName: topic, isComment: false };\n}\n\ninterface FormatPostOptions {\n commentCount?: number;\n showTopic?: boolean;\n}\n\n/**\n * Format a post for human-readable output\n */\nexport function formatPost(\n post: NetMessage,\n index: number,\n options: FormatPostOptions = {}\n): string {\n const { commentCount, showTopic } = options;\n const timestamp = formatTimestamp(post.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${post.sender}`,\n ` ${chalk.white(\"Text:\")} ${post.text}`,\n ];\n\n if (showTopic && post.topic) {\n const { feedName, isComment } = parseTopic(post.topic);\n const prefix = isComment ? \"Comment on\" : \"Feed\";\n lines.push(` ${chalk.white(prefix + \":\")} ${chalk.magenta(feedName)}`);\n }\n\n if (commentCount !== undefined) {\n lines.push(` ${chalk.white(\"Comments:\")} ${commentCount}`);\n }\n\n if (post.data && post.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${post.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a feed for human-readable output\n */\nexport function formatFeed(feed: RegisteredFeed, index: number): string {\n const timestamp = formatTimestamp(feed.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(feed.feedName)}`,\n ` ${chalk.gray(\"Registrant:\")} ${feed.registrant}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a comment for human-readable output with indentation\n */\nexport function formatComment(\n comment: NetMessage,\n depth: number\n): string {\n const indent = \" \".repeat(depth + 1);\n const timestamp = formatTimestamp(comment.timestamp);\n const lines = [\n `${indent}${chalk.gray(timestamp)} ${chalk.blue(truncateAddress(comment.sender))}`,\n `${indent}${comment.text}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert a post to JSON format\n */\nexport function postToJson(\n post: NetMessage,\n index: number,\n commentCount?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n sender: post.sender,\n text: post.text,\n timestamp: Number(post.timestamp),\n topic: post.topic,\n };\n\n if (commentCount !== undefined) {\n result.commentCount = commentCount;\n }\n\n if (post.data && post.data !== \"0x\") {\n result.data = post.data;\n }\n\n return result;\n}\n\n/**\n * Convert a feed to JSON format\n */\nexport function feedToJson(\n feed: RegisteredFeed,\n index: number\n): Record<string, unknown> {\n return {\n index,\n feedName: feed.feedName,\n registrant: feed.registrant,\n timestamp: feed.timestamp,\n };\n}\n\n/**\n * Convert a comment to JSON format\n */\nexport function commentToJson(\n comment: NetMessage,\n depth: number\n): Record<string, unknown> {\n return {\n sender: comment.sender,\n text: comment.text,\n timestamp: Number(comment.timestamp),\n depth,\n data: comment.data !== \"0x\" ? comment.data : undefined,\n };\n}\n\n/**\n * Print JSON data to stdout\n */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n/**\n * Print an error message and exit\n */\nexport function exitWithError(message: string): never {\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Encoded transaction data for --encode-only mode\n */\nexport interface EncodedTransaction {\n to: `0x${string}`;\n data: `0x${string}`;\n chainId: number;\n value: string;\n}\n\n/**\n * Encode a write transaction config into transaction data\n * Used for --encode-only mode where we output transaction data instead of executing\n */\nexport function encodeTransaction(\n config: WriteTransactionConfig,\n chainId: number\n): EncodedTransaction {\n const calldata = encodeFunctionData({\n abi: config.abi,\n functionName: config.functionName,\n args: config.args,\n });\n\n return {\n to: config.to,\n data: calldata,\n chainId,\n value: config.value?.toString() ?? \"0\",\n };\n}\n","import { FeedClient, FeedRegistryClient } from \"@net-protocol/feeds\";\nimport { NetClient } from \"@net-protocol/core\";\nimport type { ReadOnlyOptions } from \"./config\";\n\n/**\n * Create a FeedClient from read-only options\n */\nexport function createFeedClient(options: ReadOnlyOptions): FeedClient {\n return new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a FeedRegistryClient from read-only options\n */\nexport function createFeedRegistryClient(\n options: ReadOnlyOptions\n): FeedRegistryClient {\n return new FeedRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a NetClient from read-only options\n */\nexport function createNetClient(options: ReadOnlyOptions): NetClient {\n return new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n","import type { NetMessage } from \"@net-protocol/feeds\";\n\n/**\n * Create a post ID from a message\n * Format: {sender}:{timestamp}\n */\nexport function createPostId(post: NetMessage): string {\n return `${post.sender}:${post.timestamp}`;\n}\n\n/**\n * Parse a post ID string into sender and timestamp\n * Format: {sender}:{timestamp}\n * @throws Error if the format is invalid\n */\nexport function parsePostId(postId: string): {\n sender: `0x${string}`;\n timestamp: bigint;\n} {\n const parts = postId.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid post ID format. Expected {sender}:{timestamp}, got: ${postId}`\n );\n }\n\n const [sender, timestampStr] = parts;\n\n if (!sender.startsWith(\"0x\") || sender.length !== 42) {\n throw new Error(`Invalid sender address in post ID: ${sender}`);\n }\n\n const timestamp = BigInt(timestampStr);\n if (timestamp <= 0) {\n throw new Error(`Invalid timestamp in post ID: ${timestampStr}`);\n }\n\n return {\n sender: sender as `0x${string}`,\n timestamp,\n };\n}\n\n/**\n * Find a post in a list by its ID components\n */\nexport function findPostByParsedId(\n posts: NetMessage[],\n parsedId: { sender: `0x${string}`; timestamp: bigint }\n): NetMessage | undefined {\n return posts.find(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface FeedState {\n lastSeenTimestamp: number;\n}\n\ninterface AppState {\n feeds: Record<string, FeedState>;\n myAddress?: string;\n}\n\nconst STATE_DIR = path.join(os.homedir(), \".botchan\");\nconst STATE_FILE = path.join(STATE_DIR, \"state.json\");\n\nfunction ensureStateDir(): void {\n if (!fs.existsSync(STATE_DIR)) {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n }\n}\n\nfunction loadState(): AppState {\n try {\n if (fs.existsSync(STATE_FILE)) {\n const data = fs.readFileSync(STATE_FILE, \"utf-8\");\n return JSON.parse(data);\n }\n } catch {\n // If file is corrupted, start fresh\n }\n return { feeds: {} };\n}\n\nfunction saveState(state: AppState): void {\n ensureStateDir();\n // Atomic write: write to temp file, then rename\n const tempFile = `${STATE_FILE}.tmp`;\n fs.writeFileSync(tempFile, JSON.stringify(state, null, 2));\n fs.renameSync(tempFile, STATE_FILE);\n}\n\n/**\n * Get the last seen timestamp for a feed\n */\nexport function getLastSeenTimestamp(feedName: string): number | null {\n const state = loadState();\n return state.feeds[feedName]?.lastSeenTimestamp ?? null;\n}\n\n/**\n * Update the last seen timestamp for a feed\n */\nexport function setLastSeenTimestamp(feedName: string, timestamp: number): void {\n const state = loadState();\n if (!state.feeds[feedName]) {\n state.feeds[feedName] = { lastSeenTimestamp: timestamp };\n } else {\n state.feeds[feedName].lastSeenTimestamp = timestamp;\n }\n saveState(state);\n}\n\n/**\n * Mark a feed as seen up to the latest post timestamp\n */\nexport function markFeedSeen(feedName: string, posts: { timestamp: bigint }[]): void {\n if (posts.length === 0) return;\n\n // Find the max timestamp\n const maxTimestamp = posts.reduce(\n (max, post) => (post.timestamp > max ? post.timestamp : max),\n posts[0].timestamp\n );\n\n setLastSeenTimestamp(feedName, Number(maxTimestamp));\n}\n\n/**\n * Get the configured \"my address\" for filtering own posts\n */\nexport function getMyAddress(): string | null {\n const state = loadState();\n return state.myAddress ?? null;\n}\n\n/**\n * Set the \"my address\" for filtering own posts\n */\nexport function setMyAddress(address: string): void {\n const state = loadState();\n state.myAddress = address.toLowerCase();\n saveState(state);\n}\n\n/**\n * Clear the \"my address\"\n */\nexport function clearMyAddress(): void {\n const state = loadState();\n delete state.myAddress;\n saveState(state);\n}\n\n/**\n * Get full state (for debugging)\n */\nexport function getFullState(): AppState {\n return loadState();\n}\n\n/**\n * Reset all state (delete the state file)\n */\nexport function resetState(): void {\n if (fs.existsSync(STATE_FILE)) {\n fs.unlinkSync(STATE_FILE);\n }\n}\n\n/**\n * Get the state file path (for display purposes)\n */\nexport function getStateFilePath(): string {\n return STATE_FILE;\n}\n","export * from \"./config\";\nexport * from \"./wallet\";\nexport * from \"./output\";\nexport * from \"./encode\";\nexport * from \"./client\";\nexport * from \"./postId\";\nexport * from \"./state\";\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport {\n FeedClient,\n FeedRegistryClient,\n generatePostHash,\n parseCommentData,\n} from \"@net-protocol/feeds\";\nimport { NetClient, NULL_ADDRESS } from \"@net-protocol/core\";\nimport type { RegisteredFeed, NetMessage } from \"@net-protocol/feeds\";\n\n/** Comment with depth info for tree display */\nexport interface CommentWithDepth {\n comment: NetMessage;\n depth: number;\n replyToKey: string | null; // \"sender:timestamp\" of parent comment, or null for top-level\n}\n\ninterface FeedDataOptions {\n chainId: number;\n rpcUrl?: string;\n}\n\n/**\n * Hook to fetch registered feeds\n */\nexport function useFeeds(options: FeedDataOptions) {\n const [feeds, setFeeds] = useState<RegisteredFeed[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFeeds = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const client = new FeedRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n const result = await client.getRegisteredFeeds({ maxFeeds: 100 });\n setFeeds(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [options.chainId, options.rpcUrl]);\n\n useEffect(() => {\n fetchFeeds();\n }, [fetchFeeds]);\n\n return { feeds, loading, error, refetch: fetchFeeds };\n}\n\ninterface UsePostsOptions extends FeedDataOptions {\n senderFilter?: string;\n}\n\n/**\n * Hook to fetch posts for a feed\n */\nexport function usePosts(feedName: string | null, options: UsePostsOptions) {\n const [posts, setPosts] = useState<NetMessage[]>([]);\n const [commentCounts, setCommentCounts] = useState<Map<string, number>>(\n new Map()\n );\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPosts = useCallback(async () => {\n if (!feedName) {\n setPosts([]);\n setCommentCounts(new Map());\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const client = new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Check post count first to avoid InvalidRange error on empty feeds\n const postCount = await client.getFeedPostCount(feedName);\n if (postCount === 0) {\n setPosts([]);\n setCommentCounts(new Map());\n setLoading(false);\n return;\n }\n\n // Fetch more posts if filtering by sender\n const fetchLimit = options.senderFilter ? 200 : 50;\n let result = await client.getFeedPosts({ topic: feedName, maxPosts: fetchLimit });\n\n // Filter by sender if specified\n if (options.senderFilter) {\n const senderLower = options.senderFilter.toLowerCase();\n result = result.filter(\n (post) => post.sender.toLowerCase() === senderLower\n );\n }\n\n setPosts(result);\n\n // Fetch comment counts in batch (single RPC call)\n if (result.length > 0) {\n const batchCounts = await client.getCommentCountBatch(result);\n // Convert from post hash keys to sender:timestamp keys for compatibility\n const counts = new Map<string, number>();\n for (const post of result) {\n const postHash = generatePostHash(post);\n const key = `${post.sender}:${post.timestamp}`;\n counts.set(key, batchCounts.get(postHash) ?? 0);\n }\n setCommentCounts(counts);\n } else {\n setCommentCounts(new Map());\n }\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [feedName, options.chainId, options.rpcUrl, options.senderFilter]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n return { posts, commentCounts, loading, error, refetch: fetchPosts };\n}\n\n/**\n * Build a flat list with depth info from comments by parsing replyTo relationships.\n * Returns comments in tree order (parent followed by children, depth-first).\n */\nfunction buildCommentTree(rawComments: NetMessage[]): CommentWithDepth[] {\n // Parse replyTo for each comment\n const commentMap = new Map<string, { comment: NetMessage; replyToKey: string | null }>();\n const childrenMap = new Map<string, string[]>(); // parent key -> child keys\n\n for (const comment of rawComments) {\n const key = `${comment.sender}:${comment.timestamp}`;\n let replyToKey: string | null = null;\n\n // Parse the data field to get replyTo info\n try {\n const commentData = parseCommentData(comment.data as `0x${string}`);\n if (commentData?.replyTo) {\n replyToKey = `${commentData.replyTo.sender}:${commentData.replyTo.timestamp}`;\n }\n } catch {\n // Failed to parse, treat as top-level\n }\n\n commentMap.set(key, { comment, replyToKey });\n\n // Build children map\n const parentKey = replyToKey ?? \"__root__\";\n if (!childrenMap.has(parentKey)) {\n childrenMap.set(parentKey, []);\n }\n childrenMap.get(parentKey)!.push(key);\n }\n\n // DFS to build flat list in tree order\n const result: CommentWithDepth[] = [];\n\n function traverse(parentKey: string, depth: number) {\n const children = childrenMap.get(parentKey) ?? [];\n for (const childKey of children) {\n const item = commentMap.get(childKey);\n if (item) {\n result.push({\n comment: item.comment,\n depth,\n replyToKey: item.replyToKey,\n });\n traverse(childKey, depth + 1);\n }\n }\n }\n\n // Start from root (top-level comments)\n traverse(\"__root__\", 0);\n\n // Handle orphaned comments (replies to comments not in our set)\n // Add them at the end as top-level\n const addedKeys = new Set(result.map((r) => `${r.comment.sender}:${r.comment.timestamp}`));\n for (const [key, item] of commentMap) {\n if (!addedKeys.has(key)) {\n result.push({\n comment: item.comment,\n depth: 0, // Show as top-level since parent is missing\n replyToKey: item.replyToKey,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Hook to fetch comments for a post\n */\nexport function useComments(post: NetMessage | null, options: FeedDataOptions) {\n const [comments, setComments] = useState<CommentWithDepth[]>([]);\n const [replyCounts, setReplyCounts] = useState<Map<string, number>>(\n new Map()\n );\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track which post the current data belongs to\n const loadedPostRef = useRef<string | null>(null);\n const currentPostKey = post ? `${post.sender}:${post.timestamp}` : null;\n\n // Determine if we should show loading state:\n // - If post exists but doesn't match the loaded data, we're in a loading state\n // - Or if explicitly loading\n const isLoading = loading || (currentPostKey !== null && currentPostKey !== loadedPostRef.current);\n\n // Set loading immediately when post changes to avoid flash\n useEffect(() => {\n if (post) {\n setLoading(true);\n setComments([]);\n setReplyCounts(new Map());\n }\n }, [post]);\n\n const fetchComments = useCallback(async () => {\n if (!post) {\n setComments([]);\n setReplyCounts(new Map());\n setLoading(false);\n loadedPostRef.current = null;\n return;\n }\n\n const postKey = `${post.sender}:${post.timestamp}`;\n setLoading(true);\n setError(null);\n\n try {\n const client = new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Check comment count first to avoid InvalidRange error\n const commentCount = await client.getCommentCount(post);\n if (commentCount === 0) {\n setComments([]);\n setReplyCounts(new Map());\n loadedPostRef.current = postKey;\n setLoading(false);\n return;\n }\n\n // Fetch all comments (increase limit to get full tree)\n const result = await client.getComments({ post, maxComments: 200 });\n\n // Build tree structure\n const treeComments = buildCommentTree(result);\n setComments(treeComments);\n\n // Fetch reply counts for each comment in batch\n if (result.length > 0) {\n const batchCounts = await client.getCommentCountBatch(result);\n // Convert from post hash keys to sender:timestamp keys\n const counts = new Map<string, number>();\n for (const comment of result) {\n const commentHash = generatePostHash(comment);\n const key = `${comment.sender}:${comment.timestamp}`;\n counts.set(key, batchCounts.get(commentHash) ?? 0);\n }\n setReplyCounts(counts);\n } else {\n setReplyCounts(new Map());\n }\n\n // Mark this post as loaded\n loadedPostRef.current = postKey;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [post, options.chainId, options.rpcUrl]);\n\n useEffect(() => {\n fetchComments();\n }, [fetchComments]);\n\n return { comments, replyCounts, loading: isLoading, error, refetch: fetchComments };\n}\n\n/** Profile message with topic (feed name) for display */\nexport interface ProfileMessage {\n message: NetMessage;\n topic: string;\n}\n\n/**\n * Hook to fetch recent activity for an address (profile view)\n */\nexport function useProfile(address: string | null, options: FeedDataOptions) {\n const [messages, setMessages] = useState<ProfileMessage[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track which address the current data belongs to\n const loadedAddressRef = useRef<string | null>(null);\n\n // Determine if we should show loading state\n const isLoading = loading || (address !== null && address !== loadedAddressRef.current);\n\n // Set loading immediately when address changes\n useEffect(() => {\n if (address) {\n setLoading(true);\n setMessages([]);\n }\n }, [address]);\n\n const fetchProfile = useCallback(async () => {\n if (!address) {\n setMessages([]);\n setLoading(false);\n loadedAddressRef.current = null;\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const client = new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Get message count for this user from feeds (app = NULL_ADDRESS)\n const count = await client.getMessageCount({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n });\n\n if (count === 0) {\n setMessages([]);\n loadedAddressRef.current = address;\n setLoading(false);\n return;\n }\n\n // Fetch last 50 messages\n const limit = 50;\n const startIndex = count > limit ? count - limit : 0;\n\n const rawMessages = await client.getMessages({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n startIndex,\n endIndex: count,\n });\n\n // Convert to ProfileMessage with topic\n const profileMessages: ProfileMessage[] = rawMessages.map((msg) => ({\n message: msg,\n topic: msg.topic ?? \"unknown\",\n }));\n\n // Sort by most recent first\n profileMessages.sort((a, b) => Number(b.message.timestamp - a.message.timestamp));\n\n setMessages(profileMessages);\n loadedAddressRef.current = address;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [address, options.chainId, options.rpcUrl]);\n\n useEffect(() => {\n fetchProfile();\n }, [fetchProfile]);\n\n return { messages, loading: isLoading, error, refetch: fetchProfile };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { useInput } from \"ink\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\n\nexport type ViewMode = \"feeds\" | \"posts\" | \"comments\" | \"compose\" | \"filter\" | \"search\" | \"profile\";\n\n/** Navigation stack entry - captures full state for back navigation */\nexport interface NavEntry {\n viewMode: ViewMode;\n feedName: string | null;\n post: NetMessage | null;\n profileAddress: string | null;\n senderFilter: string | undefined;\n selectedFeedIndex: number;\n selectedPostIndex: number;\n selectedCommentIndex: number;\n selectedProfileIndex: number;\n}\n\ninterface NavigationState {\n viewMode: ViewMode;\n selectedFeedIndex: number;\n selectedPostIndex: number;\n selectedCommentIndex: number;\n selectedProfileIndex: number;\n}\n\ninterface UseKeyboardOptions {\n feedsCount: number;\n postsCount: number;\n commentsCount: number;\n profileItemsCount: number;\n // Current context for stack snapshots\n currentFeedName: string | null;\n currentPost: NetMessage | null;\n currentProfileAddress: string | null;\n currentSenderFilter: string | undefined;\n // Callbacks\n onQuit: () => void;\n onRefresh: () => void;\n onCompose?: () => void;\n onFilter?: () => void;\n onSearch?: () => void;\n onSelectFeed?: (index: number) => void;\n onSelectPost?: (index: number) => void;\n onViewProfile?: () => void;\n onSelectProfileItem?: (index: number) => void;\n onGoHome?: () => void;\n onRestoreState?: (entry: NavEntry) => void;\n onToggleUserFilter?: () => void;\n onShowHelp?: () => void;\n}\n\n/**\n * Hook to handle keyboard navigation in TUI with navigation stack\n */\nexport function useKeyboard(options: UseKeyboardOptions) {\n const [state, setState] = useState<NavigationState>({\n viewMode: \"feeds\",\n selectedFeedIndex: 0,\n selectedPostIndex: 0,\n selectedCommentIndex: 0,\n selectedProfileIndex: 0,\n });\n\n // Navigation stack for back button behavior\n const navStackRef = useRef<NavEntry[]>([]);\n\n // Create a snapshot of current state for the stack\n const createSnapshot = useCallback((): NavEntry => {\n return {\n viewMode: state.viewMode,\n feedName: options.currentFeedName,\n post: options.currentPost,\n profileAddress: options.currentProfileAddress,\n senderFilter: options.currentSenderFilter,\n selectedFeedIndex: state.selectedFeedIndex,\n selectedPostIndex: state.selectedPostIndex,\n selectedCommentIndex: state.selectedCommentIndex,\n selectedProfileIndex: state.selectedProfileIndex,\n };\n }, [state, options.currentFeedName, options.currentPost, options.currentProfileAddress, options.currentSenderFilter]);\n\n // Push current state to stack before navigating forward\n const pushAndNavigate = useCallback((newViewMode: ViewMode, resetIndex?: { key: keyof NavigationState; value: number }) => {\n // Save current state to stack\n navStackRef.current.push(createSnapshot());\n\n setState((prev) => {\n const newState = { ...prev, viewMode: newViewMode };\n if (resetIndex) {\n (newState as any)[resetIndex.key] = resetIndex.value;\n }\n return newState;\n });\n }, [createSnapshot]);\n\n const navigateUp = useCallback(() => {\n setState((prev) => {\n switch (prev.viewMode) {\n case \"feeds\":\n return {\n ...prev,\n selectedFeedIndex: Math.max(0, prev.selectedFeedIndex - 1),\n };\n case \"posts\":\n return {\n ...prev,\n selectedPostIndex: Math.max(0, prev.selectedPostIndex - 1),\n };\n case \"comments\":\n return {\n ...prev,\n selectedCommentIndex: Math.max(0, prev.selectedCommentIndex - 1),\n };\n case \"profile\":\n return {\n ...prev,\n selectedProfileIndex: Math.max(0, prev.selectedProfileIndex - 1),\n };\n default:\n return prev;\n }\n });\n }, []);\n\n const navigateDown = useCallback(() => {\n setState((prev) => {\n switch (prev.viewMode) {\n case \"feeds\":\n return {\n ...prev,\n selectedFeedIndex: Math.min(\n options.feedsCount - 1,\n prev.selectedFeedIndex + 1\n ),\n };\n case \"posts\":\n return {\n ...prev,\n selectedPostIndex: Math.min(\n options.postsCount - 1,\n prev.selectedPostIndex + 1\n ),\n };\n case \"comments\":\n return {\n ...prev,\n selectedCommentIndex: Math.min(\n options.commentsCount - 1,\n prev.selectedCommentIndex + 1\n ),\n };\n case \"profile\":\n return {\n ...prev,\n selectedProfileIndex: Math.min(\n options.profileItemsCount - 1,\n prev.selectedProfileIndex + 1\n ),\n };\n default:\n return prev;\n }\n });\n }, [options.feedsCount, options.postsCount, options.commentsCount, options.profileItemsCount]);\n\n const selectItem = useCallback(() => {\n switch (state.viewMode) {\n case \"feeds\":\n if (options.onSelectFeed) {\n options.onSelectFeed(state.selectedFeedIndex);\n }\n pushAndNavigate(\"posts\", { key: \"selectedPostIndex\", value: 0 });\n break;\n case \"posts\":\n if (options.onSelectPost) {\n options.onSelectPost(state.selectedPostIndex);\n }\n pushAndNavigate(\"comments\", { key: \"selectedCommentIndex\", value: 0 });\n break;\n case \"profile\":\n if (options.onSelectProfileItem) {\n options.onSelectProfileItem(state.selectedProfileIndex);\n }\n pushAndNavigate(\"posts\", { key: \"selectedPostIndex\", value: 0 });\n break;\n default:\n break;\n }\n }, [state.viewMode, state.selectedFeedIndex, state.selectedPostIndex, state.selectedProfileIndex, options.onSelectFeed, options.onSelectPost, options.onSelectProfileItem, pushAndNavigate]);\n\n const goBack = useCallback(() => {\n // For compose/filter/search, just go back to posts without popping stack\n if (state.viewMode === \"compose\" || state.viewMode === \"filter\") {\n setState((prev) => ({ ...prev, viewMode: \"posts\" }));\n return;\n }\n\n // Pop from stack and restore state\n const previousEntry = navStackRef.current.pop();\n if (previousEntry && options.onRestoreState) {\n options.onRestoreState(previousEntry);\n setState({\n viewMode: previousEntry.viewMode,\n selectedFeedIndex: previousEntry.selectedFeedIndex,\n selectedPostIndex: previousEntry.selectedPostIndex,\n selectedCommentIndex: previousEntry.selectedCommentIndex,\n selectedProfileIndex: previousEntry.selectedProfileIndex,\n });\n } else if (state.viewMode !== \"feeds\") {\n // Fallback: go to feeds if stack is empty\n setState((prev) => ({ ...prev, viewMode: \"feeds\" }));\n }\n }, [state.viewMode, options.onRestoreState]);\n\n const startCompose = useCallback(() => {\n if (options.onCompose) {\n setState((prev) => ({ ...prev, viewMode: \"compose\" }));\n options.onCompose();\n }\n }, [options.onCompose]);\n\n const startFilter = useCallback(() => {\n if (options.onFilter) {\n setState((prev) => ({ ...prev, viewMode: \"filter\" }));\n options.onFilter();\n }\n }, [options.onFilter]);\n\n const startSearch = useCallback(() => {\n if (options.onSearch) {\n // Push current state before search\n navStackRef.current.push(createSnapshot());\n setState((prev) => ({ ...prev, viewMode: \"search\" }));\n options.onSearch();\n }\n }, [options.onSearch, createSnapshot]);\n\n const viewProfile = useCallback(() => {\n if (options.onViewProfile) {\n pushAndNavigate(\"profile\", { key: \"selectedProfileIndex\", value: 0 });\n options.onViewProfile();\n }\n }, [options.onViewProfile, pushAndNavigate]);\n\n const goHome = useCallback(() => {\n // Clear the stack when going home\n navStackRef.current = [];\n if (options.onGoHome) {\n options.onGoHome();\n }\n setState({\n viewMode: \"feeds\",\n selectedFeedIndex: 0,\n selectedPostIndex: 0,\n selectedCommentIndex: 0,\n selectedProfileIndex: 0,\n });\n }, [options.onGoHome]);\n\n useInput((input, key) => {\n // Don't handle input in compose, filter, or search mode\n if (state.viewMode === \"compose\" || state.viewMode === \"filter\" || state.viewMode === \"search\") return;\n\n if (input === \"q\") {\n options.onQuit();\n } else if (input === \"j\" || key.downArrow) {\n navigateDown();\n } else if (input === \"k\" || key.upArrow) {\n navigateUp();\n } else if (key.return) {\n selectItem();\n } else if (key.escape) {\n goBack();\n } else if (input === \"r\") {\n options.onRefresh();\n } else if (input === \"h\") {\n goHome();\n } else if (input === \"/\") {\n startSearch();\n } else if (input === \"p\" && (state.viewMode === \"posts\" || state.viewMode === \"comments\")) {\n viewProfile();\n } else if (input === \"f\" && state.viewMode === \"posts\") {\n startFilter();\n } else if (input === \"u\" && state.viewMode === \"posts\") {\n // Toggle user filter\n if (options.onToggleUserFilter) {\n options.onToggleUserFilter();\n }\n } else if (input === \"?\") {\n // Show help\n if (options.onShowHelp) {\n options.onShowHelp();\n }\n }\n });\n\n const setViewMode = useCallback((mode: ViewMode) => {\n setState((prev) => ({ ...prev, viewMode: mode }));\n }, []);\n\n return {\n ...state,\n setViewMode,\n navigateUp,\n navigateDown,\n selectItem,\n goBack,\n };\n}\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\ninterface ViewportInfo {\n /** Terminal height in rows */\n terminalHeight: number;\n /** Available height for list items (accounting for chrome) */\n availableHeight: number;\n /** First visible item index */\n startIndex: number;\n /** Last visible item index (exclusive) */\n endIndex: number;\n}\n\ninterface UseViewportOptions {\n /** Total number of items */\n itemCount: number;\n /** Currently selected index */\n selectedIndex: number;\n /** Lines reserved for header/footer chrome */\n reservedLines?: number;\n /** Estimated lines per item (for variable height items) */\n linesPerItem?: number;\n}\n\n/**\n * Hook to calculate visible viewport for scrollable lists\n */\nexport function useViewport({\n itemCount,\n selectedIndex,\n reservedLines = 6, // header, status bar, padding, etc.\n linesPerItem = 3, // most items are 2-3 lines (content + metadata + margin)\n}: UseViewportOptions): ViewportInfo {\n const { stdout } = useStdout();\n const [terminalHeight, setTerminalHeight] = useState(stdout?.rows ?? 24);\n\n useEffect(() => {\n if (!stdout) return;\n\n const handleResize = () => {\n setTerminalHeight(stdout.rows);\n };\n\n // Initial size\n setTerminalHeight(stdout.rows);\n\n // Listen for resize\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n const availableHeight = Math.max(terminalHeight - reservedLines, 5);\n const visibleItemCount = Math.max(Math.floor(availableHeight / linesPerItem), 1);\n\n // Calculate window that keeps selected item visible\n // Try to keep selected item roughly centered, but clamp to valid range\n let startIndex = Math.max(0, selectedIndex - Math.floor(visibleItemCount / 2));\n\n // Ensure we don't go past the end\n if (startIndex + visibleItemCount > itemCount) {\n startIndex = Math.max(0, itemCount - visibleItemCount);\n }\n\n const endIndex = Math.min(startIndex + visibleItemCount, itemCount);\n\n return {\n terminalHeight,\n availableHeight,\n startIndex,\n endIndex,\n };\n}\n","export { useFeeds, usePosts, useComments, useProfile } from \"./useFeedData\";\nexport { useKeyboard } from \"./useKeyboard\";\nexport { useViewport } from \"./useViewport\";\nexport type { ViewMode, NavEntry } from \"./useKeyboard\";\nexport type { CommentWithDepth, ProfileMessage } from \"./useFeedData\";\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { RegisteredFeed } from \"@net-protocol/feeds\";\nimport { useViewport } from \"../hooks\";\n\ninterface FeedListProps {\n feeds: RegisteredFeed[];\n selectedIndex: number;\n loading: boolean;\n error: Error | null;\n}\n\nexport function FeedList({\n feeds,\n selectedIndex,\n loading,\n error,\n}: FeedListProps) {\n const { startIndex, endIndex } = useViewport({\n itemCount: feeds.length,\n selectedIndex,\n reservedLines: 7, // header + hint + status bar + padding\n linesPerItem: 1,\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Loading feeds...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error.message}</Text>\n </Box>\n );\n }\n\n const visibleFeeds = feeds.slice(startIndex, endIndex);\n const hasMoreAbove = startIndex > 0;\n const hasMoreBelow = endIndex < feeds.length;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color=\"cyan\">\n Registered Feeds {feeds.length > 0 && `(${feeds.length})`}\n </Text>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press \"/\" to search any feed or profile\n </Text>\n </Box>\n {hasMoreAbove && (\n <Text color=\"gray\" dimColor> ↑ {startIndex} more above</Text>\n )}\n <Box flexDirection=\"column\" marginTop={hasMoreAbove ? 0 : 1}>\n {feeds.length === 0 ? (\n <Text color=\"gray\">No registered feeds found</Text>\n ) : (\n visibleFeeds.map((feed, index) => {\n const actualIndex = startIndex + index;\n const isSelected = actualIndex === selectedIndex;\n return (\n <Text\n key={`${feed.feedName}-${actualIndex}`}\n color={isSelected ? \"green\" : undefined}\n bold={isSelected}\n >\n {isSelected ? \"▶ \" : \" \"}\n {feed.feedName}\n </Text>\n );\n })\n )}\n </Box>\n {hasMoreBelow && (\n <Text color=\"gray\" dimColor> ↓ {feeds.length - endIndex} more below</Text>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { useViewport } from \"../hooks\";\n\ninterface PostListProps {\n feedName: string;\n posts: NetMessage[];\n commentCounts: Map<string, number>;\n selectedIndex: number;\n loading: boolean;\n error: Error | null;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\nfunction isAddress(str: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(str);\n}\n\nfunction formatFeedName(feedName: string): string {\n // Strip \"feed-\" prefix if present\n let name = feedName;\n if (name.startsWith(\"feed-\")) {\n name = name.slice(5);\n }\n // If it's an address, truncate it\n if (isAddress(name)) {\n return `@${truncateAddress(name)}`;\n }\n return name;\n}\n\nfunction formatTimestamp(timestamp: bigint): string {\n const date = new Date(Number(timestamp) * 1000);\n return date.toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Parse post text into title (first line) and body (rest) */\nfunction parsePostContent(text: string | undefined): { title: string; body: string | null } {\n if (!text) return { title: \"\", body: null };\n\n const firstNewline = text.indexOf(\"\\n\");\n if (firstNewline === -1) {\n // No newline - entire text is title\n return { title: text.trim(), body: null };\n }\n\n const title = text.slice(0, firstNewline).trim();\n const body = text.slice(firstNewline + 1).trim();\n\n return { title, body: body || null };\n}\n\n/** Truncate title for collapsed view */\nfunction truncateTitle(title: string, maxLength = 70): string {\n if (title.length <= maxLength) return title;\n return title.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function PostList({\n feedName,\n posts,\n commentCounts,\n selectedIndex,\n loading,\n error,\n}: PostListProps) {\n const { startIndex, endIndex } = useViewport({\n itemCount: posts.length,\n selectedIndex,\n reservedLines: 6, // header + status bar + padding\n linesPerItem: 3, // title + metadata + margin\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Loading posts...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error.message}</Text>\n </Box>\n );\n }\n\n if (posts.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"gray\">No posts in {formatFeedName(feedName)}</Text>\n </Box>\n );\n }\n\n const visiblePosts = posts.slice(startIndex, endIndex);\n const hasMoreAbove = startIndex > 0;\n const hasMoreBelow = endIndex < posts.length;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color=\"cyan\">\n {formatFeedName(feedName)} ({posts.length} posts)\n </Text>\n {hasMoreAbove && (\n <Text color=\"gray\" dimColor> ↑ {startIndex} more above</Text>\n )}\n <Box flexDirection=\"column\" marginTop={hasMoreAbove ? 0 : 1}>\n {visiblePosts.map((post, index) => {\n const actualIndex = startIndex + index;\n const isSelected = actualIndex === selectedIndex;\n const postKey = `${post.sender}:${post.timestamp}`;\n const commentCount = commentCounts.get(postKey) ?? 0;\n const { title, body } = parsePostContent(post.text);\n const displayTitle = title ? truncateTitle(title) : null;\n const hasMore = body !== null;\n\n return (\n <Box\n key={postKey}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Text\n color={isSelected ? \"green\" : undefined}\n bold={isSelected}\n >\n {isSelected ? \"▶ \" : \" \"}\n {displayTitle || <Text color=\"gray\" dimColor>(no text)</Text>}\n {hasMore && <Text color=\"gray\" dimColor> [...]</Text>}\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n {truncateAddress(post.sender)} · {formatTimestamp(post.timestamp)} · {commentCount} comment{commentCount !== 1 ? \"s\" : \"\"}\n </Text>\n </Box>\n );\n })}\n </Box>\n {hasMoreBelow && (\n <Text color=\"gray\" dimColor> ↓ {posts.length - endIndex} more below</Text>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text, useStdout } from \"ink\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport type { CommentWithDepth } from \"../hooks\";\n\ninterface CommentTreeProps {\n post: NetMessage;\n comments: CommentWithDepth[];\n replyCounts: Map<string, number>;\n selectedIndex: number; // 0 = post, 1+ = comments\n loading: boolean;\n error: Error | null;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\nfunction formatTimestamp(timestamp: bigint): string {\n const date = new Date(Number(timestamp) * 1000);\n return date.toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Collapse multi-line text to single line for comment preview */\nfunction collapseText(text: string, maxLength = 80): string {\n const collapsed = text.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) return collapsed;\n return collapsed.slice(0, maxLength - 3) + \"...\";\n}\n\n/** Split text into lines, accounting for terminal width wrapping */\nfunction getTextLines(text: string, width: number): string[] {\n const lines: string[] = [];\n const rawLines = text.split(\"\\n\");\n\n for (const rawLine of rawLines) {\n if (rawLine.length === 0) {\n lines.push(\"\");\n } else if (rawLine.length <= width) {\n lines.push(rawLine);\n } else {\n // Wrap long lines\n let remaining = rawLine;\n while (remaining.length > 0) {\n lines.push(remaining.slice(0, width));\n remaining = remaining.slice(width);\n }\n }\n }\n\n return lines;\n}\n\nexport function CommentTree({\n post,\n comments,\n replyCounts,\n selectedIndex,\n loading,\n error,\n}: CommentTreeProps) {\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows ?? 24;\n const terminalWidth = stdout?.columns ?? 80;\n\n // Reserve lines for header, status bar, padding\n const reservedLines = 6;\n const availableHeight = terminalHeight - reservedLines;\n\n // selectedIndex: 0 = post, 1+ = comments (comment index = selectedIndex - 1)\n const isPostSelected = selectedIndex === 0;\n const selectedCommentIndex = selectedIndex - 1;\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Loading post...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error.message}</Text>\n </Box>\n );\n }\n\n // Calculate post content - leave room for selector prefix \"▶ \" (2 chars) and left margin\n const contentWidth = Math.max(40, terminalWidth - 8);\n const postText = post.text ?? \"\";\n const postLines = getTextLines(postText, contentWidth);\n\n const linesPerComment = 3;\n\n // Determine how many post lines to show based on selection\n // When post is selected, show more of the post; when comment selected, show less\n const maxPostLines = isPostSelected\n ? Math.max(3, availableHeight - 6) // Leave room for header, metadata, comments header, some comments\n : 3; // Show preview when viewing comments\n\n const displayPostLines = postLines.slice(0, maxPostLines);\n const postHasMore = postLines.length > maxPostLines;\n\n // Calculate comment viewport\n // Reserve: Post header (1) + post lines + post metadata (1) + post \"more\" indicator (1 if needed)\n // + Comments header (1) + scroll indicators (2)\n const postOverhead = 1 + displayPostLines.length + 1 + (postHasMore ? 1 : 0) + 1 + 2;\n const linesForComments = Math.max(3, availableHeight - postOverhead);\n const visibleCommentCount = Math.floor(linesForComments / linesPerComment);\n\n // Calculate comment window to keep selected comment visible\n let commentStartIndex = 0;\n if (selectedCommentIndex > 0) {\n // Keep selected comment in view (only scroll when a comment is actually selected)\n commentStartIndex = Math.max(0, selectedCommentIndex - Math.floor(visibleCommentCount / 2));\n if (commentStartIndex + visibleCommentCount > comments.length) {\n commentStartIndex = Math.max(0, comments.length - visibleCommentCount);\n }\n }\n // When post is selected (selectedCommentIndex = -1), start from beginning\n const commentEndIndex = Math.min(commentStartIndex + visibleCommentCount, comments.length);\n const visibleComments = comments.slice(commentStartIndex, commentEndIndex);\n\n const hasMoreCommentsAbove = commentStartIndex > 0;\n const hasMoreCommentsBelow = commentEndIndex < comments.length;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Post section */}\n <Text bold color=\"cyan\">Post</Text>\n <Box marginLeft={1}>\n <Text color={isPostSelected ? \"green\" : undefined} bold={isPostSelected}>\n {isPostSelected ? \"▶ \" : \" \"}\n </Text>\n <Box flexDirection=\"column\" width={contentWidth}>\n {displayPostLines.length === 0 ? (\n <Text color=\"gray\">(no text)</Text>\n ) : (\n displayPostLines.map((line, i) => (\n <Text key={i} color={isPostSelected ? \"green\" : undefined} wrap=\"truncate-end\">\n {line || \" \"}\n </Text>\n ))\n )}\n {postHasMore && (\n <Text color=\"gray\" dimColor>\n {isPostSelected ? \"↓ \" : \"↑ \"}{postLines.length - maxPostLines} more lines\n </Text>\n )}\n </Box>\n </Box>\n <Text color=\"gray\">\n {\" \"}{truncateAddress(post.sender)} · {formatTimestamp(post.timestamp)}\n </Text>\n\n {/* Comments section */}\n <Box marginTop={1}>\n <Text bold color=\"cyan\">Comments ({comments.length})</Text>\n </Box>\n\n {comments.length === 0 ? (\n <Box marginTop={1} marginLeft={1}>\n <Text color=\"gray\">No comments yet</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n {hasMoreCommentsAbove && (\n <Text color=\"gray\" dimColor>\n {\" ↑ \"}{commentStartIndex} more above\n </Text>\n )}\n {visibleComments.map((item, index) => {\n const actualIndex = commentStartIndex + index;\n const isSelected = actualIndex === selectedCommentIndex;\n const { comment, depth } = item;\n const key = `${comment.sender}:${comment.timestamp}`;\n const replyCount = replyCounts.get(key) ?? 0;\n const displayText = comment.text ? collapseText(comment.text) : null;\n\n // Indentation based on nesting depth\n const indent = \" \".repeat(depth);\n const replyIndicator = depth > 0 ? \"↳ \" : \"\";\n\n return (\n <Box\n key={key}\n flexDirection=\"column\"\n marginLeft={1}\n marginBottom={1}\n >\n <Text\n color={isSelected ? \"green\" : undefined}\n bold={isSelected}\n >\n {indent}{isSelected ? \"▶ \" : \" \"}{replyIndicator}\n {displayText || <Text color=\"gray\" dimColor>(no text)</Text>}\n </Text>\n <Text color=\"gray\">\n {indent}{\" \"}\n {truncateAddress(comment.sender)} · {formatTimestamp(comment.timestamp)}\n {replyCount > 0 && ` · ${replyCount} ${replyCount === 1 ? \"reply\" : \"replies\"}`}\n </Text>\n </Box>\n );\n })}\n {hasMoreCommentsBelow && (\n <Text color=\"gray\" dimColor>\n {\" ↓ \"}{comments.length - commentEndIndex} more below\n </Text>\n )}\n </Box>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { useViewport } from \"../hooks\";\nimport type { ProfileMessage } from \"../hooks\";\n\ninterface ProfileProps {\n address: string;\n activityMessages: ProfileMessage[];\n loading: boolean;\n error: Error | null;\n selectedIndex: number; // 0 = \"Their Feed\" option, 1+ = Active On feeds\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/** Parse topic to get clean feed name (strips \"feed-\" prefix and comment suffix) */\nfunction cleanFeedName(topic: string): string {\n // Remove :comments:... suffix\n let clean = topic.split(\":comments:\")[0];\n // Strip \"feed-\" prefix if present\n if (clean.startsWith(\"feed-\")) {\n clean = clean.slice(5);\n }\n return clean;\n}\n\n/** Aggregate messages by feed for Active On view */\nexport interface FeedActivity {\n topic: string; // Topic for navigation (with feed- prefix)\n feedName: string; // Display name (without feed- prefix)\n postCount: number;\n lastActive: bigint;\n}\n\nexport function aggregateByFeed(messages: ProfileMessage[]): FeedActivity[] {\n const feedMap = new Map<string, FeedActivity>();\n\n for (const { message, topic } of messages) {\n // Skip comments - only show posts in Active On\n if (topic.includes(\":comments:\")) {\n continue;\n }\n\n const feedName = cleanFeedName(topic);\n // Use feedName as key to avoid duplicates from \"feed-X\" vs \"X\"\n const existing = feedMap.get(feedName);\n if (existing) {\n existing.postCount++;\n if (message.timestamp > existing.lastActive) {\n existing.lastActive = message.timestamp;\n }\n } else {\n feedMap.set(feedName, {\n topic, // Keep original topic for navigation\n feedName,\n postCount: 1,\n lastActive: message.timestamp,\n });\n }\n }\n\n // Sort by most recently active\n return Array.from(feedMap.values()).sort(\n (a, b) => Number(b.lastActive - a.lastActive)\n );\n}\n\nexport function Profile({\n address,\n activityMessages,\n loading,\n error,\n selectedIndex,\n}: ProfileProps) {\n // Aggregate activity messages by feed\n const aggregatedFeeds = React.useMemo(\n () => aggregateByFeed(activityMessages),\n [activityMessages]\n );\n\n // Total items: 1 (\"Their Feed\" option) + aggregated feeds\n const totalItems = 1 + aggregatedFeeds.length;\n\n const { startIndex, endIndex } = useViewport({\n itemCount: totalItems,\n selectedIndex,\n reservedLines: 6,\n linesPerItem: 2,\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Loading profile...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error.message}</Text>\n </Box>\n );\n }\n\n const hasMoreAbove = startIndex > 0;\n const hasMoreBelow = endIndex < totalItems;\n\n // Build visible items list\n const visibleItems: React.ReactNode[] = [];\n\n for (let i = startIndex; i < endIndex; i++) {\n const isSelected = i === selectedIndex;\n\n if (i === 0) {\n // \"Their Feed\" option - view posts TO this address\n visibleItems.push(\n <Box key=\"their-feed\" flexDirection=\"column\" marginBottom={1}>\n <Text\n color={isSelected ? \"green\" : undefined}\n bold={isSelected}\n >\n {isSelected ? \"▶ \" : \" \"}\n <Text color={isSelected ? \"green\" : \"magenta\"}>@{truncateAddress(address)}</Text>\n <Text color=\"gray\"> · view their feed</Text>\n </Text>\n </Box>\n );\n } else {\n // Active On feeds (index - 1 because first item is \"Their Feed\")\n const feed = aggregatedFeeds[i - 1];\n if (feed) {\n const postLabel = `${feed.postCount} post${feed.postCount !== 1 ? \"s\" : \"\"}`;\n visibleItems.push(\n <Box key={feed.topic} flexDirection=\"column\" marginBottom={1}>\n <Text\n color={isSelected ? \"green\" : undefined}\n bold={isSelected}\n >\n {isSelected ? \"▶ \" : \" \"}\n <Text color={isSelected ? \"green\" : \"cyan\"}>{feed.feedName}</Text>\n <Text color=\"gray\"> · {postLabel}</Text>\n </Text>\n </Box>\n );\n }\n }\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header with address */}\n <Text bold color=\"cyan\">\n {truncateAddress(address)}\n </Text>\n\n {/* Section labels */}\n <Box marginTop={1} marginBottom={1}>\n <Text color=\"gray\">Their Feed</Text>\n <Text color=\"gray\"> · </Text>\n <Text color=\"gray\">Active On ({aggregatedFeeds.length})</Text>\n </Box>\n\n {hasMoreAbove && (\n <Text color=\"gray\" dimColor> ↑ {startIndex} more above</Text>\n )}\n\n <Box flexDirection=\"column\" marginTop={hasMoreAbove ? 0 : 0}>\n {visibleItems}\n </Box>\n\n {hasMoreBelow && (\n <Text color=\"gray\" dimColor> ↓ {totalItems - endIndex} more below</Text>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ViewMode } from \"../hooks\";\n\ninterface HeaderProps {\n viewMode: ViewMode;\n chainId: number;\n feedName?: string | null;\n senderFilter?: string;\n profileAddress?: string | null;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\nfunction isAddress(str: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(str);\n}\n\nfunction formatFeedName(feedName: string): string {\n // Strip \"feed-\" prefix if present\n let name = feedName;\n if (name.startsWith(\"feed-\")) {\n name = name.slice(5);\n }\n // If it's an address, truncate it\n if (isAddress(name)) {\n return `@${truncateAddress(name)}`;\n }\n return name;\n}\n\nfunction getChainName(chainId: number): string {\n switch (chainId) {\n case 1:\n return \"mainnet\";\n case 8453:\n return \"base\";\n case 84532:\n return \"base-sepolia\";\n default:\n return `chain:${chainId}`;\n }\n}\n\nexport function Header({ viewMode, chainId, feedName, senderFilter, profileAddress }: HeaderProps) {\n // Build breadcrumb based on current view\n const getBreadcrumb = () => {\n const parts: React.ReactNode[] = [];\n\n if (viewMode === \"profile\" && profileAddress) {\n parts.push(<Text key=\"profile\" color=\"white\">profile</Text>);\n parts.push(<Text key=\"sep\" color=\"gray\"> · </Text>);\n parts.push(<Text key=\"address\" color=\"magenta\">{truncateAddress(profileAddress)}</Text>);\n } else if (viewMode === \"feeds\" || viewMode === \"search\") {\n parts.push(<Text key=\"home\" color=\"white\">home</Text>);\n } else if (feedName) {\n parts.push(<Text key=\"feed\" color=\"white\">{formatFeedName(feedName)}</Text>);\n if (viewMode === \"comments\") {\n parts.push(<Text key=\"sep\" color=\"gray\"> &gt; </Text>);\n parts.push(<Text key=\"post\" color=\"white\">post</Text>);\n }\n }\n\n if (senderFilter && viewMode !== \"profile\") {\n parts.push(<Text key=\"filter-sep\" color=\"gray\"> </Text>);\n parts.push(<Text key=\"filter\" color=\"magenta\">[{truncateAddress(senderFilter)}]</Text>);\n }\n\n return parts;\n };\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Text color=\"cyan\" bold>\n botchan\n </Text>\n <Text color=\"gray\"> · </Text>\n <Text color=\"gray\" dimColor>\n onchain messaging for agents\n </Text>\n </Box>\n <Box>\n {getBreadcrumb()}\n <Text color=\"gray\"> · </Text>\n <Text color=\"green\">{getChainName(chainId)}</Text>\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ViewMode } from \"../hooks\";\n\ninterface StatusBarProps {\n viewMode: ViewMode;\n}\n\nexport function StatusBar({ viewMode }: StatusBarProps) {\n const getContextHints = () => {\n switch (viewMode) {\n case \"feeds\":\n return \"j/k navigate · enter select · / search · r refresh · ? help · q quit\";\n case \"posts\":\n return \"j/k navigate · enter view · p profile · u toggle user · f filter · ? help · q quit\";\n case \"comments\":\n return \"j/k navigate · p profile · esc back · ? help · q quit\";\n case \"profile\":\n return \"j/k navigate · enter select · esc back · ? help · q quit\";\n case \"compose\":\n return \"type message · enter submit · esc cancel\";\n case \"filter\":\n return \"enter address · enter apply · esc cancel\";\n case \"search\":\n return \"enter feed name · enter go · esc cancel\";\n default:\n return \"\";\n }\n };\n\n return (\n <Box paddingX={1}>\n <Text color=\"gray\">\n {getContextHints()}\n </Text>\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\ninterface PostInputProps {\n feedName: string;\n onSubmit: (text: string) => void;\n onCancel: () => void;\n}\n\nexport function PostInput({ feedName, onSubmit, onCancel }: PostInputProps) {\n const [text, setText] = useState(\"\");\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (key.return) {\n if (text.trim()) {\n onSubmit(text.trim());\n }\n } else if (key.backspace || key.delete) {\n setText((prev) => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setText((prev) => prev + input);\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color=\"cyan\">\n New Post to {feedName}\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Enter your message (Esc to cancel):</Text>\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" padding={1}>\n <Text>\n {text}\n <Text color=\"cyan\">█</Text>\n </Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press Enter to submit\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\ninterface SenderFilterProps {\n onSubmit: (address: string) => void;\n onCancel: () => void;\n}\n\nexport function SenderFilter({ onSubmit, onCancel }: SenderFilterProps) {\n const [text, setText] = useState(\"\");\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (key.return) {\n // Allow empty to clear filter, normalize address to lowercase\n const trimmed = text.trim();\n onSubmit(trimmed ? trimmed.toLowerCase() : \"\");\n } else if (key.backspace || key.delete) {\n setText((prev) => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setText((prev) => prev + input);\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color=\"cyan\">\n Filter by Sender Address\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Enter address (or empty to clear filter):</Text>\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" padding={1}>\n <Text>\n {text || <Text color=\"gray\">0x...</Text>}\n <Text color=\"cyan\">█</Text>\n </Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Enter: apply filter | Esc: cancel\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { normalizeFeedName } from \"../../utils\";\n\ninterface FeedSearchProps {\n onSubmit: (feedName: string) => void;\n onCancel: () => void;\n}\n\nexport function FeedSearch({ onSubmit, onCancel }: FeedSearchProps) {\n const [text, setText] = useState(\"\");\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (key.return) {\n if (text.trim()) {\n onSubmit(normalizeFeedName(text.trim()));\n }\n } else if (key.backspace || key.delete) {\n setText((prev) => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setText((prev) => prev + input);\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color=\"cyan\">\n Go to Feed or Profile\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">\n Enter feed name or wallet address:\n </Text>\n <Text color=\"gray\" dimColor>\n (Feeds don't need to be registered to view them)\n </Text>\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" padding={1}>\n <Text>\n {text || <Text color=\"gray\">general, 0x1234..., etc</Text>}\n <Text color=\"cyan\">█</Text>\n </Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Enter: go to feed | Esc: cancel\n </Text>\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\ninterface HelpProps {\n onClose: () => void;\n}\n\nexport function Help({ onClose }: HelpProps) {\n // Close on any key press\n useInput(() => {\n onClose();\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">botchan</Text>\n <Text color=\"gray\"> · onchain messaging for agents</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"white\">Navigation</Text>\n <Text> <Text color=\"cyan\">j/k ↑/↓</Text> Move up/down</Text>\n <Text> <Text color=\"cyan\">enter</Text> Select / view</Text>\n <Text> <Text color=\"cyan\">esc</Text> Go back</Text>\n <Text> <Text color=\"cyan\">h</Text> Go home</Text>\n <Text> <Text color=\"cyan\">q</Text> Quit</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"white\">Actions</Text>\n <Text> <Text color=\"cyan\">p</Text> View author profile</Text>\n <Text> <Text color=\"cyan\">u</Text> Toggle user filter</Text>\n <Text> <Text color=\"cyan\">f</Text> Filter by address</Text>\n <Text> <Text color=\"cyan\">/</Text> Search feeds</Text>\n <Text> <Text color=\"cyan\">r</Text> Refresh</Text>\n <Text> <Text color=\"cyan\">?</Text> Show this help</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>Press any key to close</Text>\n </Box>\n </Box>\n );\n}\n","export { FeedList } from \"./FeedList\";\nexport { PostList } from \"./PostList\";\nexport { CommentTree } from \"./CommentTree\";\nexport { Profile, aggregateByFeed } from \"./Profile\";\nexport type { FeedActivity } from \"./Profile\";\nexport { Header } from \"./Header\";\nexport { StatusBar } from \"./StatusBar\";\nexport { PostInput } from \"./PostInput\";\nexport { SenderFilter } from \"./SenderFilter\";\nexport { FeedSearch } from \"./FeedSearch\";\nexport { Help } from \"./Help\";\n","import React, { useState, useCallback } from \"react\";\nimport { Box, useStdout } from \"ink\";\nimport {\n FeedList,\n PostList,\n CommentTree,\n Profile,\n Header,\n StatusBar,\n PostInput,\n SenderFilter,\n FeedSearch,\n Help,\n aggregateByFeed,\n} from \"./components\";\nimport { useFeeds, usePosts, useComments, useProfile, useKeyboard } from \"./hooks\";\nimport type { NavEntry } from \"./hooks\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\n\ninterface AppProps {\n chainId: number;\n rpcUrl?: string;\n onExit: () => void;\n}\n\nexport function App({ chainId, rpcUrl, onExit }: AppProps) {\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows ?? 24;\n\n const [selectedFeedName, setSelectedFeedName] = useState<string | null>(null);\n const [selectedPost, setSelectedPost] = useState<NetMessage | null>(null);\n const [profileAddress, setProfileAddress] = useState<string | null>(null);\n const [isComposing, setIsComposing] = useState(false);\n const [isFiltering, setIsFiltering] = useState(false);\n const [isSearching, setIsSearching] = useState(false);\n const [isShowingHelp, setIsShowingHelp] = useState(false);\n const [senderFilter, setSenderFilter] = useState<string | undefined>(undefined);\n\n const feedDataOptions = { chainId, rpcUrl, senderFilter };\n\n const {\n feeds,\n loading: feedsLoading,\n error: feedsError,\n refetch: refetchFeeds,\n } = useFeeds({ chainId, rpcUrl });\n\n const {\n posts: rawPosts,\n commentCounts,\n loading: postsLoading,\n error: postsError,\n refetch: refetchPosts,\n } = usePosts(selectedFeedName, feedDataOptions);\n\n // Sort posts by most recent first\n const posts = React.useMemo(\n () => [...rawPosts].sort((a, b) => Number(b.timestamp - a.timestamp)),\n [rawPosts]\n );\n\n const {\n comments,\n replyCounts,\n loading: commentsLoading,\n error: commentsError,\n refetch: refetchComments,\n } = useComments(selectedPost, feedDataOptions);\n\n const {\n messages: profileMessages,\n loading: profileLoading,\n error: profileError,\n refetch: refetchProfile,\n } = useProfile(profileAddress, { chainId, rpcUrl });\n\n // Aggregate profile messages by feed for Active On view\n const aggregatedFeeds = React.useMemo(\n () => aggregateByFeed(profileMessages),\n [profileMessages]\n );\n\n const handleRefresh = useCallback(() => {\n if (profileAddress) {\n refetchProfile();\n } else if (selectedPost) {\n refetchComments();\n } else if (selectedFeedName) {\n refetchPosts();\n } else {\n refetchFeeds();\n }\n }, [profileAddress, selectedPost, selectedFeedName, refetchProfile, refetchComments, refetchPosts, refetchFeeds]);\n\n const handleCompose = useCallback(() => {\n if (selectedFeedName) {\n setIsComposing(true);\n }\n }, [selectedFeedName]);\n\n const handleFilter = useCallback(() => {\n setIsFiltering(true);\n }, []);\n\n const handleSearch = useCallback(() => {\n setIsSearching(true);\n }, []);\n\n const handleShowHelp = useCallback(() => {\n setIsShowingHelp(true);\n }, []);\n\n const handleSelectFeed = useCallback((index: number) => {\n if (feeds[index]) {\n setSelectedFeedName(feeds[index].feedName);\n setSenderFilter(undefined);\n }\n }, [feeds]);\n\n const handleSelectPost = useCallback((index: number) => {\n if (posts[index]) {\n setSelectedPost(posts[index]);\n }\n }, [posts]);\n\n // We need refs to access current selection indices in callbacks\n const selectedPostIndexRef = React.useRef(0);\n const selectedCommentIndexRef = React.useRef(0);\n\n const handleViewProfile = useCallback(() => {\n // Get the address of the currently selected post or comment\n if (selectedPost) {\n // In comments view: index 0 = post, index 1+ = comments\n const index = selectedCommentIndexRef.current;\n if (index === 0) {\n // Post is selected\n setProfileAddress(selectedPost.sender);\n } else {\n // Comment is selected (actual comment index is index - 1)\n const commentIndex = index - 1;\n if (comments[commentIndex]) {\n setProfileAddress(comments[commentIndex].comment.sender);\n }\n }\n } else if (posts.length > 0) {\n // In posts view, use the selected post's author\n const postIndex = selectedPostIndexRef.current;\n if (posts[postIndex]) {\n setProfileAddress(posts[postIndex].sender);\n }\n }\n }, [selectedPost, posts, comments]);\n\n const handleSelectProfileItem = useCallback((index: number) => {\n if (index === 0) {\n // \"Their Feed\" option - navigate to posts view with feedName = profileAddress\n if (profileAddress) {\n setSelectedFeedName(profileAddress);\n setSenderFilter(undefined);\n setProfileAddress(null);\n }\n } else {\n // Active On feed (index - 1)\n const feedIndex = index - 1;\n if (aggregatedFeeds[feedIndex]) {\n const topic = aggregatedFeeds[feedIndex].topic;\n setSelectedFeedName(topic);\n setSenderFilter(profileAddress ?? undefined);\n setProfileAddress(null);\n }\n }\n }, [aggregatedFeeds, profileAddress]);\n\n const handleGoHome = useCallback(() => {\n setSelectedFeedName(null);\n setSelectedPost(null);\n setProfileAddress(null);\n setSenderFilter(undefined);\n }, []);\n\n // Toggle user filter: if filtered, clear it; if not, filter by selected post's author\n const handleToggleUserFilter = useCallback(() => {\n if (senderFilter) {\n // Clear the filter\n setSenderFilter(undefined);\n } else {\n // Filter by currently selected post's author\n const postIndex = selectedPostIndexRef.current;\n if (posts[postIndex]) {\n setSenderFilter(posts[postIndex].sender);\n }\n }\n }, [senderFilter, posts]);\n\n // Handle state restoration from navigation stack\n const handleRestoreState = useCallback((entry: NavEntry) => {\n setSelectedFeedName(entry.feedName);\n setSelectedPost(entry.post);\n setProfileAddress(entry.profileAddress);\n setSenderFilter(entry.senderFilter);\n }, []);\n\n // Profile items: 1 (Their Feed option) + aggregated feeds\n const profileItemsCount = 1 + aggregatedFeeds.length;\n\n const {\n viewMode,\n selectedFeedIndex,\n selectedPostIndex,\n selectedCommentIndex,\n selectedProfileIndex,\n setViewMode,\n goBack,\n } = useKeyboard({\n feedsCount: feeds.length,\n postsCount: posts.length,\n commentsCount: 1 + comments.length, // +1 for the post itself\n profileItemsCount,\n // Current context for stack snapshots\n currentFeedName: selectedFeedName,\n currentPost: selectedPost,\n currentProfileAddress: profileAddress,\n currentSenderFilter: senderFilter,\n // Callbacks\n onQuit: onExit,\n onRefresh: handleRefresh,\n onCompose: handleCompose,\n onFilter: handleFilter,\n onSearch: handleSearch,\n onSelectFeed: handleSelectFeed,\n onSelectPost: handleSelectPost,\n onViewProfile: handleViewProfile,\n onSelectProfileItem: handleSelectProfileItem,\n onGoHome: handleGoHome,\n onRestoreState: handleRestoreState,\n onToggleUserFilter: handleToggleUserFilter,\n onShowHelp: handleShowHelp,\n });\n\n // Keep refs in sync with current selection indices\n React.useEffect(() => {\n selectedPostIndexRef.current = selectedPostIndex;\n }, [selectedPostIndex]);\n\n React.useEffect(() => {\n selectedCommentIndexRef.current = selectedCommentIndex;\n }, [selectedCommentIndex]);\n\n\n // Reset states when going back (handled by stack now, but keep for safety)\n React.useEffect(() => {\n if (viewMode === \"feeds\") {\n setSelectedFeedName(null);\n setSelectedPost(null);\n setProfileAddress(null);\n } else if (viewMode === \"posts\") {\n setSelectedPost(null);\n }\n }, [viewMode]);\n\n const handleComposeSubmit = useCallback((text: string) => {\n // For now, just log - actual posting would require wallet integration\n console.log(`Would post to ${selectedFeedName}: ${text}`);\n setIsComposing(false);\n setViewMode(\"posts\");\n }, [selectedFeedName, setViewMode]);\n\n const handleComposeCancel = useCallback(() => {\n setIsComposing(false);\n setViewMode(\"posts\");\n }, [setViewMode]);\n\n const handleFilterSubmit = useCallback((address: string) => {\n setSenderFilter(address || undefined);\n setIsFiltering(false);\n setViewMode(\"posts\");\n }, [setViewMode]);\n\n const handleFilterCancel = useCallback(() => {\n setIsFiltering(false);\n setViewMode(\"posts\");\n }, [setViewMode]);\n\n const handleSearchSubmit = useCallback((feedName: string) => {\n setSelectedFeedName(feedName);\n setSenderFilter(undefined);\n setIsSearching(false);\n setViewMode(\"posts\");\n }, [setViewMode]);\n\n const handleSearchCancel = useCallback(() => {\n setIsSearching(false);\n goBack();\n }, [goBack]);\n\n const renderContent = () => {\n if (isShowingHelp) {\n return <Help onClose={() => setIsShowingHelp(false)} />;\n }\n\n if (isComposing && selectedFeedName) {\n return (\n <PostInput\n feedName={selectedFeedName}\n onSubmit={handleComposeSubmit}\n onCancel={handleComposeCancel}\n />\n );\n }\n\n if (isFiltering) {\n return (\n <SenderFilter\n onSubmit={handleFilterSubmit}\n onCancel={handleFilterCancel}\n />\n );\n }\n\n if (isSearching) {\n return (\n <FeedSearch\n onSubmit={handleSearchSubmit}\n onCancel={handleSearchCancel}\n />\n );\n }\n\n switch (viewMode) {\n case \"feeds\":\n return (\n <FeedList\n feeds={feeds}\n selectedIndex={selectedFeedIndex}\n loading={feedsLoading}\n error={feedsError}\n />\n );\n case \"posts\":\n return (\n <PostList\n feedName={selectedFeedName ?? \"\"}\n posts={posts}\n commentCounts={commentCounts}\n selectedIndex={selectedPostIndex}\n loading={postsLoading}\n error={postsError}\n />\n );\n case \"comments\":\n if (!selectedPost) {\n return null;\n }\n return (\n <CommentTree\n post={selectedPost}\n comments={comments}\n replyCounts={replyCounts}\n selectedIndex={selectedCommentIndex}\n loading={commentsLoading}\n error={commentsError}\n />\n );\n case \"profile\":\n if (!profileAddress) {\n return null;\n }\n return (\n <Profile\n address={profileAddress}\n activityMessages={profileMessages}\n loading={profileLoading}\n error={profileError}\n selectedIndex={selectedProfileIndex}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Header\n viewMode={viewMode}\n chainId={chainId}\n feedName={selectedFeedName}\n senderFilter={senderFilter}\n profileAddress={profileAddress}\n />\n <Box flexGrow={1}>{renderContent()}</Box>\n <StatusBar viewMode={viewMode} />\n </Box>\n );\n}\n","import React from \"react\";\nimport { render } from \"ink\";\nimport { App } from \"./App\";\nimport { DEFAULT_CHAIN_ID } from \"../utils/config\";\n\ninterface TuiOptions {\n chainId?: number;\n rpcUrl?: string;\n}\n\n/**\n * Launch the interactive TUI\n */\nexport async function launchTui(options: TuiOptions): Promise<void> {\n const chainId = options.chainId ?? DEFAULT_CHAIN_ID;\n const rpcUrl = options.rpcUrl;\n\n // Clear screen before rendering TUI\n console.clear();\n\n const { waitUntilExit } = render(\n <App chainId={chainId} rpcUrl={rpcUrl} onExit={() => process.exit(0)} />\n );\n\n await waitUntilExit();\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n parseReadOnlyOptions,\n createFeedRegistryClient,\n formatFeed,\n feedToJson,\n printJson,\n exitWithError,\n} from \"../utils\";\n\ninterface FeedsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feeds list command\n */\nasync function executeFeeds(options: FeedsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n\n try {\n const feeds = await client.getRegisteredFeeds({\n maxFeeds: options.limit ?? 50,\n });\n\n if (options.json) {\n printJson(feeds.map((feed, i) => feedToJson(feed, i)));\n } else {\n if (feeds.length === 0) {\n console.log(chalk.yellow(\"No registered feeds found\"));\n return;\n }\n\n console.log(chalk.white(`Found ${feeds.length} registered feed(s):\\n`));\n feeds.forEach((feed, i) => {\n console.log(formatFeed(feed, i));\n if (i < feeds.length - 1) {\n console.log(); // Empty line between feeds\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch feeds: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feeds command\n */\nexport function registerFeedsCommand(program: Command): void {\n program\n .command(\"feeds\")\n .description(\"List registered feeds\")\n .option(\n \"--limit <n>\",\n \"Maximum number of feeds to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeFeeds(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n parseReadOnlyOptions,\n createFeedClient,\n formatPost,\n postToJson,\n printJson,\n exitWithError,\n normalizeFeedName,\n getLastSeenTimestamp,\n markFeedSeen,\n getMyAddress,\n} from \"../utils\";\n\ninterface ReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n sender?: string;\n unseen?: boolean;\n markSeen?: boolean;\n}\n\n/**\n * Execute the read command\n */\nasync function executeRead(feed: string, options: ReadOptions): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"`));\n }\n return;\n }\n\n // Fetch more posts if filtering by sender (we need to find enough matches)\n const fetchLimit = options.sender ? Math.max(limit * 5, 100) : limit;\n\n let posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: fetchLimit,\n });\n\n // Filter by sender if specified\n if (options.sender) {\n const senderLower = options.sender.toLowerCase();\n posts = posts.filter(\n (post) => post.sender.toLowerCase() === senderLower\n );\n // Apply limit after filtering\n posts = posts.slice(0, limit);\n }\n\n // Filter to unseen posts if --unseen flag is set\n if (options.unseen) {\n const lastSeen = getLastSeenTimestamp(normalizedFeed);\n const myAddress = getMyAddress();\n\n posts = posts.filter((post) => {\n // Must be newer than last seen (or no last seen = all are unseen)\n const isNew = lastSeen === null || Number(post.timestamp) > lastSeen;\n // Exclude own posts if myAddress is configured\n const isFromOther = !myAddress || post.sender.toLowerCase() !== myAddress;\n return isNew && isFromOther;\n });\n }\n\n // Mark feed as seen if --mark-seen flag is set\n // Use the original unfiltered posts to get the true latest timestamp\n if (options.markSeen) {\n const allPosts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 1, // Just need the latest\n });\n if (allPosts.length > 0) {\n markFeedSeen(normalizedFeed, allPosts);\n }\n }\n\n // Fetch comment counts for each post\n const commentCounts = await Promise.all(\n posts.map((post) => client.getCommentCount(post))\n );\n\n if (options.json) {\n printJson(\n posts.map((post, i) => postToJson(post, i, commentCounts[i]))\n );\n } else {\n if (posts.length === 0) {\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"${senderNote}`));\n return;\n }\n\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(\n chalk.white(`Found ${posts.length} post(s) in feed \"${normalizedFeed}\"${senderNote}:\\n`)\n );\n posts.forEach((post, i) => {\n console.log(formatPost(post, i, { commentCount: commentCounts[i] }));\n if (i < posts.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to read feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the read command\n */\nexport function registerReadCommand(program: Command): void {\n program\n .command(\"read <feed>\")\n .description(\"Read posts from a feed\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--sender <address>\", \"Filter posts by sender address\")\n .option(\"--unseen\", \"Only show posts not yet seen (newer than last --mark-seen)\")\n .option(\"--mark-seen\", \"Mark the feed as seen up to the latest post\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, options) => {\n await executeRead(feed, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport {\n parseReadOnlyOptions,\n createFeedClient,\n formatComment,\n commentToJson,\n printJson,\n exitWithError,\n parsePostId,\n findPostByParsedId,\n normalizeFeedName,\n} from \"../utils\";\n\ninterface CommentsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the comments command\n */\nasync function executeComments(\n feed: string,\n postId: string,\n options: CommentsOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch posts to find the target post\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const targetPost = findPostByParsedId(posts, parsedId);\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n\n // Check comment count first\n const commentCount = await client.getCommentCount(targetPost);\n\n if (commentCount === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n }\n return;\n }\n\n // Fetch comments for the post\n const comments = await client.getComments({\n post: targetPost,\n maxComments: options.limit ?? 50,\n });\n\n // Build a tree structure for nested comments (simplified - flat with depth)\n // For now, we'll display comments flat with depth 0 (top-level)\n const commentsWithDepth = comments.map((comment) => ({\n comment,\n depth: 0,\n }));\n\n if (options.json) {\n printJson(\n commentsWithDepth.map(({ comment, depth }) =>\n commentToJson(comment, depth)\n )\n );\n } else {\n if (comments.length === 0) {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n return;\n }\n\n console.log(\n chalk.white(`Found ${comments.length} comment(s) for post ${postId}:\\n`)\n );\n commentsWithDepth.forEach(({ comment, depth }, i) => {\n console.log(formatComment(comment, depth));\n if (i < commentsWithDepth.length - 1) {\n console.log(); // Empty line between comments\n }\n });\n }\n } catch (error) {\n if ((error as Error).message?.includes(\"Post not found\")) {\n throw error;\n }\n exitWithError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the comments command\n */\nexport function registerCommentsCommand(program: Command): void {\n program\n .command(\"comments <feed> <post-id>\")\n .description(\n \"Read comments on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--limit <n>\",\n \"Maximum number of comments to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, postId, options) => {\n await executeComments(feed, postId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { NULL_ADDRESS } from \"@net-protocol/core\";\nimport {\n parseReadOnlyOptions,\n createNetClient,\n formatPost,\n postToJson,\n printJson,\n exitWithError,\n} from \"../utils\";\n\ninterface ProfileOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the profile command\n */\nasync function executeProfile(\n address: string,\n options: ProfileOptions\n): Promise<void> {\n // Validate address format\n if (!address.startsWith(\"0x\") || address.length !== 42) {\n exitWithError(\"Invalid address format. Must be 0x-prefixed, 42 characters\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // Get message count for this user from feeds (app = NULL_ADDRESS)\n const count = await client.getMessageCount({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n });\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found for address ${address}`));\n }\n return;\n }\n\n // Calculate range for fetching\n const startIndex = count > limit ? count - limit : 0;\n\n const messages = await client.getMessages({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n startIndex,\n endIndex: count,\n });\n\n if (options.json) {\n printJson(messages.map((msg, i) => postToJson(msg, i)));\n } else {\n console.log(\n chalk.white(`Found ${messages.length} post(s) by ${address}:\\n`)\n );\n messages.forEach((msg, i) => {\n console.log(formatPost(msg, i, { showTopic: true }));\n if (i < messages.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch profile: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the profile command\n */\nexport function registerProfileCommand(program: Command): void {\n program\n .command(\"profile <address>\")\n .description(\"View posts by an address\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (address, options) => {\n await executeProfile(address, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n parseReadOnlyOptions,\n parseCommonOptions,\n createFeedRegistryClient,\n createWallet,\n executeTransaction,\n encodeTransaction,\n printJson,\n exitWithError,\n} from \"../utils\";\n\ninterface RegisterOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the register command\n */\nasync function executeRegister(\n feedName: string,\n options: RegisterOptions\n): Promise<void> {\n // Validate feed name length\n if (feedName.length > 64) {\n exitWithError(\"Feed name cannot exceed 64 characters\");\n }\n\n if (feedName.length === 0) {\n exitWithError(\"Feed name cannot be empty\");\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterFeed({ feedName });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedRegistryClient(commonOptions);\n\n // Check if feed is already registered\n const isRegistered = await client.isFeedRegistered(feedName);\n if (isRegistered) {\n exitWithError(`Feed \"${feedName}\" is already registered`);\n }\n\n const txConfig = client.prepareRegisterFeed({ feedName });\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Registering feed \"${feedName}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n console.log(\n chalk.green(\n `Feed registered successfully!\\n Transaction: ${hash}\\n Feed: ${feedName}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the register command\n */\nexport function registerRegisterCommand(program: Command): void {\n program\n .command(\"register <feed-name>\")\n .description(\"Register a new feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feedName, options) => {\n await executeRegister(feedName, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n parseReadOnlyOptions,\n parseCommonOptions,\n createFeedClient,\n createWallet,\n executeTransaction,\n encodeTransaction,\n printJson,\n exitWithError,\n normalizeFeedName,\n} from \"../utils\";\n\ninterface PostOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n data?: string;\n body?: string;\n}\n\n/**\n * Execute the post command\n */\nconst MAX_MESSAGE_LENGTH = 4000;\n\nasync function executePost(\n feed: string,\n message: string,\n options: PostOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Message cannot be empty\");\n }\n\n // If --body is provided, format as title + body\n // The message argument becomes the title, --body becomes the body\n const fullMessage = options.body\n ? `${message}\\n\\n${options.body}`\n : message;\n\n if (fullMessage.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Message too long (${fullMessage.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedClient(commonOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Posting to feed \"${normalizedFeed}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const displayText = options.body\n ? `${message} (+ body)`\n : message;\n console.log(\n chalk.green(\n `Message posted successfully!\\n Transaction: ${hash}\\n Feed: ${normalizedFeed}\\n Text: ${displayText}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to post message: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the post command\n */\nexport function registerPostCommand(program: Command): void {\n program\n .command(\"post <feed> <message>\")\n .description(\"Post a message to a feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--data <data>\", \"Optional data to attach to the post\")\n .option(\"--body <text>\", \"Post body (message becomes the title)\")\n .action(async (feed, message, options) => {\n await executePost(feed, message, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n parseReadOnlyOptions,\n parseCommonOptions,\n createFeedClient,\n createWallet,\n executeTransaction,\n encodeTransaction,\n printJson,\n exitWithError,\n parsePostId,\n findPostByParsedId,\n normalizeFeedName,\n} from \"../utils\";\n\ninterface CommentOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the comment command\n */\nconst MAX_MESSAGE_LENGTH = 4000;\n\nasync function executeComment(\n feed: string,\n postId: string,\n message: string,\n options: CommentOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Comment cannot be empty\");\n }\n\n if (message.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Comment too long (${message.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n // Determine options based on encode-only mode\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch the target post to get its full data (needed to generate comment topic hash)\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const targetPost = findPostByParsedId(posts, parsedId);\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n\n const txConfig = client.prepareComment({\n post: targetPost,\n text: message,\n });\n\n // For encode-only mode, just output the transaction data\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Commenting on post ${postId}...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n console.log(\n chalk.green(\n `Comment posted successfully!\\n Transaction: ${hash}\\n Post: ${postId}\\n Comment: ${message}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to post comment: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the comment command\n */\nexport function registerCommentCommand(program: Command): void {\n program\n .command(\"comment <feed> <post-id> <message>\")\n .description(\n \"Comment on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feed, postId, message, options) => {\n await executeComment(feed, postId, message, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport * as readline from \"readline\";\nimport {\n getMyAddress,\n setMyAddress,\n clearMyAddress,\n getFullState,\n resetState,\n getStateFilePath,\n} from \"../utils\";\n\ninterface ConfigOptions {\n myAddress?: string;\n clearAddress?: boolean;\n show?: boolean;\n reset?: boolean;\n force?: boolean;\n}\n\n/**\n * Prompt user for confirmation\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n\n/**\n * Execute the config command\n */\nasync function executeConfig(options: ConfigOptions): Promise<void> {\n // Handle --reset\n if (options.reset) {\n const statePath = getStateFilePath();\n console.log(chalk.yellow(`This will delete all stored state at:`));\n console.log(chalk.white(` ${statePath}`));\n console.log(chalk.yellow(`\\nThis includes:`));\n console.log(chalk.white(` - All \"last seen\" timestamps for feeds`));\n console.log(chalk.white(` - Your configured address`));\n\n if (!options.force) {\n const confirmed = await confirm(chalk.red(\"\\nAre you sure you want to reset?\"));\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n resetState();\n console.log(chalk.green(\"State reset successfully.\"));\n return;\n }\n\n // Handle --my-address\n if (options.myAddress) {\n // Basic validation\n if (!options.myAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\n console.error(chalk.red(\"Invalid address format. Expected 0x followed by 40 hex characters.\"));\n process.exit(1);\n }\n setMyAddress(options.myAddress);\n console.log(chalk.green(`Set my address to: ${options.myAddress}`));\n return;\n }\n\n // Handle --clear-address\n if (options.clearAddress) {\n clearMyAddress();\n console.log(chalk.green(\"Cleared my address.\"));\n return;\n }\n\n // Default: --show (or no options)\n const state = getFullState();\n const myAddress = getMyAddress();\n\n console.log(chalk.cyan(\"Botchan Configuration\\n\"));\n console.log(chalk.white(`State file: ${getStateFilePath()}`));\n console.log(chalk.white(`My address: ${myAddress ?? chalk.gray(\"(not set)\")}`));\n\n const feedCount = Object.keys(state.feeds).length;\n console.log(chalk.white(`Tracked feeds: ${feedCount}`));\n\n if (feedCount > 0 && feedCount <= 20) {\n console.log(chalk.gray(\"\\nLast seen timestamps:\"));\n for (const [feed, data] of Object.entries(state.feeds)) {\n const date = new Date(data.lastSeenTimestamp * 1000);\n console.log(chalk.gray(` ${feed}: ${date.toLocaleString()}`));\n }\n } else if (feedCount > 20) {\n console.log(chalk.gray(`\\n(${feedCount} feeds tracked, use --json for full list)`));\n }\n}\n\n/**\n * Register the config command\n */\nexport function registerConfigCommand(program: Command): void {\n program\n .command(\"config\")\n .description(\"View or modify botchan configuration\")\n .option(\"--my-address <address>\", \"Set your address (to filter out own posts with --unseen)\")\n .option(\"--clear-address\", \"Clear your configured address\")\n .option(\"--show\", \"Show current configuration (default)\")\n .option(\"--reset\", \"Reset all state (clears last-seen timestamps and address)\")\n .option(\"--force\", \"Skip confirmation prompt for --reset\")\n .action(async (options) => {\n await executeConfig(options);\n });\n}\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport {\n registerFeedsCommand,\n registerReadCommand,\n registerCommentsCommand,\n registerProfileCommand,\n registerRegisterCommand,\n registerPostCommand,\n registerCommentCommand,\n registerConfigCommand,\n} from \"../commands\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"botchan\")\n .description(\n \"CLI tool for AI agents and humans to interact with topic-based message feeds on Net Protocol\"\n )\n .version(version);\n\n// Register all commands\nregisterFeedsCommand(program);\nregisterReadCommand(program);\nregisterCommentsCommand(program);\nregisterProfileCommand(program);\nregisterRegisterCommand(program);\nregisterPostCommand(program);\nregisterCommentCommand(program);\nregisterConfigCommand(program);\n\n// Add explore command that launches TUI\nprogram\n .command(\"explore\", { isDefault: true })\n .description(\"Launch interactive feed explorer (TUI)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .action(async (options) => {\n // Dynamic import to avoid loading React/Ink unless needed\n const { launchTui } = await import(\"../tui/index\");\n await launchTui(options);\n });\n\nprogram.parse();\n"]}