From 873760566675697fe2550931dda095c615dcf6c7 Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Sat, 9 May 2026 00:42:03 +0530 Subject: [PATCH 01/77] fix: resolve TS errors for unused fileContent state and missing JSX namespace Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/x/apps/renderer/src/App.tsx | 2 +- apps/x/apps/renderer/src/components/persistent-viewer-cache.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 2dff9fd8..5ec8476b 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -688,7 +688,7 @@ function App() { // File browser state (for Knowledge section) const [selectedPath, setSelectedPath] = useState(null) - const [fileContent, setFileContent] = useState('') + const [, setFileContent] = useState('') const [editorContent, setEditorContent] = useState('') const editorContentRef = useRef('') const [editorContentByPath, setEditorContentByPath] = useState>({}) diff --git a/apps/x/apps/renderer/src/components/persistent-viewer-cache.tsx b/apps/x/apps/renderer/src/components/persistent-viewer-cache.tsx index ca71eca2..de56cf5a 100644 --- a/apps/x/apps/renderer/src/components/persistent-viewer-cache.tsx +++ b/apps/x/apps/renderer/src/components/persistent-viewer-cache.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useEffect, useState, type JSX } from 'react' import { HtmlFileViewer } from './html-file-viewer' import { PdfFileViewer } from './pdf-file-viewer' import { getViewerType, isCacheableViewerPath } from '@/lib/file-types' From e3d2a0988ba539513ff46888f586bd1433abcc55 Mon Sep 17 00:00:00 2001 From: Arjun <6592213+arkml@users.noreply.github.com> Date: Sat, 9 May 2026 12:06:54 +0530 Subject: [PATCH 02/77] embed tweets --- apps/x/apps/renderer/package.json | 1 + .../renderer/src/extensions/embed-block.tsx | 33 ++++++- apps/x/apps/renderer/src/styles/editor.css | 10 ++ .../assistant/skills/doc-collab/skill.ts | 6 +- .../core/src/knowledge/live-note/agent.ts | 6 +- apps/x/packages/shared/src/blocks.ts | 2 +- apps/x/pnpm-lock.yaml | 92 ++++++++----------- 7 files changed, 87 insertions(+), 63 deletions(-) diff --git a/apps/x/apps/renderer/package.json b/apps/x/apps/renderer/package.json index 359f1709..a193b3f1 100644 --- a/apps/x/apps/renderer/package.json +++ b/apps/x/apps/renderer/package.json @@ -49,6 +49,7 @@ "radix-ui": "^1.4.3", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-tweet": "^3.2.2", "recharts": "^3.8.0", "remark-breaks": "^4.0.0", "sonner": "^2.0.7", diff --git a/apps/x/apps/renderer/src/extensions/embed-block.tsx b/apps/x/apps/renderer/src/extensions/embed-block.tsx index b3bc6969..27039ecb 100644 --- a/apps/x/apps/renderer/src/extensions/embed-block.tsx +++ b/apps/x/apps/renderer/src/extensions/embed-block.tsx @@ -1,6 +1,7 @@ import { mergeAttributes, Node } from '@tiptap/react' import { ReactNodeViewRenderer, NodeViewWrapper } from '@tiptap/react' import { X, ExternalLink } from 'lucide-react' +import { Tweet } from 'react-tweet' import { blocks } from '@x/shared' function getEmbedUrl(provider: string, url: string): string | null { @@ -24,6 +25,28 @@ function getEmbedUrl(provider: string, url: string): string | null { return null } +function extractTweetId(url: string): string | null { + try { + const parsed = new URL(url) + const hostname = parsed.hostname + .toLowerCase() + .replace(/^www\./, '') + .replace(/^mobile\./, '') + if (hostname !== 'twitter.com' && hostname !== 'x.com') return null + + const segments = parsed.pathname.split('/').filter(Boolean) + for (let i = 0; i < segments.length - 1; i += 1) { + if ((segments[i] === 'status' || segments[i] === 'statuses') && /^\d+$/.test(segments[i + 1])) { + return segments[i + 1] + } + } + } catch { + return null + } + + return null +} + function EmbedBlockView({ node, deleteNode }: { node: { attrs: Record }; deleteNode: () => void }) { const raw = node.attrs.data as string let config: blocks.EmbedBlock | null = null @@ -45,6 +68,7 @@ function EmbedBlockView({ node, deleteNode }: { node: { attrs: Record - {embedUrl ? ( + {config.provider === 'tweet' && tweetId ? ( +
event.stopPropagation()} + > + +
+ ) : embedUrl ? (