untitled-1852README.md2 matches
28- **Backend**: TypeScript implementation of LDOC reader and writer classes
29- **Frontend**: Modern web interface for interacting with LDOC containers
30- **Viewer**: Support for viewing text files, images, and binary files
31- **API**: RESTful endpoints for encoding, extracting, and inspecting LDOC files
3258- API endpoints for handling LDOC operations
59- Frontend interface built with HTML, CSS, and JavaScript
60- File viewer with support for syntax highlighting and image preview
6162## Credits
NPLLMSearchPage.tsx7 matches
28body: JSON.stringify({
29prompt,
30image_size: "landscape_4_3",
31num_inference_steps: 4,
32num_images: 1,
33enable_safety_checker: true,
34sync_mode: true
3839if (!response.ok) {
40throw new Error(`Failed to generate image: ${response.statusText}`);
41}
4243const data = await response.json();
44return data.images[0].url;
45} catch (error) {
46console.error('Error generating profile picture:', error);
87// Use the package name and avatarText as the prompt
88const prompt = `${pkg.name} ${pkg.avatarText} profile picture`;
89const imageUrl = await generateProfilePicture(prompt);
90if (imageUrl) {
91newProfilePictures[pkg.id] = imageUrl;
92}
93});
NPLLMsystem_prompt.txt2 matches
173174- **Redirects:** Use `return new Response(null, { status: 302, headers: { Location: "/place/to/redirect" }})` instead of `Response.redirect` which is broken
175- **Images:** Avoid external images or base64 images. Use emojis, unicode symbols, or icon fonts/libraries instead
176- **AI Image:** To inline generate an AI image use: `<img src="https://maxm-imggenurl.web.val.run/the-description-of-your-image" />`
177- **Storage:** DO NOT use the Deno KV module for storage
178- **Browser APIs:** DO NOT use the `alert()`, `prompt()`, or `confirm()` methods
NPLLMChatRoute.tsx11 matches
9import { useUsageStats } from "../hooks/useUsageStats.ts";
10import { Messages } from "./Messages.tsx";
11import { InputBox, ImageDropContainer } from "./InputBox.tsx";
12import { PreviewFrame } from "./PreviewFrame.tsx";
13import { BranchSelect } from "./BranchSelect.tsx";
61refetch: () => void;
62}) {
63const [images, setImages] = useState<(string | null)[]>([]);
64const [selectedFiles, setSelectedFiles] = useState<string[]>([]);
65const { audio } = useContext(AppContext);
79branchId,
80selectedFiles,
81images,
82soundEnabled: audio,
83});
99100return (
101<ImageDropContainer running={running} images={images} setImages={setImages}>
102<div className="chat-container container">
103<div className="chat-messages">
116onSubmit={(e) => {
117handleSubmit(e);
118setImages([]);
119}}
120onCancel={handleStop}
121running={running}
122error={error}
123images={images}
124setImages={setImages}
125/>
126</div>
135className="block-link text-link lockup"
136>
137{project.imageUrl ? (
138<img src={project.imageUrl} className="image-thumbnail" />
139) : (
140<div className="image-placeholder" />
141)}
142<div>
159</div>
160<pre hidden>{JSON.stringify(messages, null, 2)}</pre>
161</ImageDropContainer>
162);
163}
NPLLMChatRouteSingleColumn.tsx15 matches
9import { useUsageStats } from "../hooks/useUsageStats.ts";
10import { Messages } from "./Messages.tsx";
11import { InputBox, ImageDropContainer } from "./InputBox.tsx";
12import { PreviewFrame } from "./PreviewFrame.tsx";
13import { BranchSelect } from "./BranchSelect.tsx";
67refetch: () => void;
68}) {
69const [images, setImages] = useState<(string|null)[]>([]);
70const [selectedFiles, setSelectedFiles] = useState<string[]>([]);
71const { audio, user } = useContext(AppContext);
85branchId,
86selectedFiles,
87images,
88soundEnabled: audio,
89});
109110return (
111<ImageDropContainer
112running={running}
113images={images}
114setImages={setImages}>
115<div className="single-column-container">
116<div className="single-sticky-header">
120rel="norefferer"
121className="block-link text-link lockup">
122{project.imageUrl ? (
123<img src={project.imageUrl} className="image-thumbnail" />
124) : user?.profileImageUrl ? (
125<img
126src={user.profileImageUrl}
127className="avatar"
128alt={user.username}
131/>
132) : (
133<div className="image-placeholder" />
134)}
135<div>{project.name}</div>
154onSubmit={e => {
155handleSubmit(e);
156setImages([]);
157}}
158onCancel={handleStop}
159running={running}
160error={error}
161images={images}
162setImages={setImages}
163/>
164<div className="footer">
173</div>
174</div>
175</ImageDropContainer>
176);
177}
NPLLMHeader.tsx2 matches
32<button className="h6">Log out</button>
33</form>
34{user?.profileImageUrl && (
35<img
36src={user.profileImageUrl}
37alt={user.username}
38width="32"
NPLLMInputBox.tsx46 matches
2import { useRef, useState, useEffect } from "react";
3import { PlusIcon, ArrowUpIcon, Square, XIcon } from "./icons.tsx";
4import { processFiles } from "../utils/images.ts";
56export function InputBox ({
11running,
12error,
13images,
14setImages,
15} : {
16value: string;
20running: boolean;
21error: any;
22images: (string|null)[];
23setImages: (images: (string|null)[]) => void;
24}) {
25const form = useRef(null);
57autoFocus={true}
58/>
59<ImageRow images={images} setImages={setImages} />
60<div className="toolbar">
61<UploadButton
62disabled={running}
63images={images}
64setImages={setImages}
65/>
66<div className="spacer" />
88}
8990export function ImageDropContainer ({
91images,
92setImages,
93running,
94children,
95}: {
96images: (string|null)[];
97setImages: (images: (string|null)[]) => void;
98running: boolean;
99children: React.ReactNode;
100}) {
101const dragging = useImageDrop({ images, setImages, running });
102103return (
105{children}
106{dragging && (
107<div className="image-drop-overlay">
108<div className="image-drop-inner">
109Drop images here to upload
110</div>
111</div>
115}
116117export function useImageDrop ({ images, setImages, running }: {
118images: (string|null)[];
119setImages(images: (string|null)[]) => void;
120running: boolean;
121}) {
143setDragging(false);
144if (e.dataTransfer?.files && !running) {
145processFiles(Array.from(e.dataTransfer.files), images, setImages);
146}
147}
164}
165166function ImageRow ({ images, setImages }: {
167images: (string|null)[];
168setImages: (images: (string|null)[]) => void;
169}) {
170return (
171<div className="image-row">
172{images.map((image, i) => (
173<Thumbnail
174key={i}
175image={image}
176onRemove={() => {
177setImages([
178...images.slice(0, i),
179...images.slice(i + 1),
180]);
181}}
186}
187188function Thumbnail ({ image, onRemove }: {
189image: string|null;
190onRemove: () => void;
191}) {
192if (!image) return null;
193194return (
195<div className="input-image">
196<img
197src={image}
198alt="User uploaded image"
199className="image-thumbnail"
200/>
201<button
202type="button"
203title="Remove image"
204className="remove-image-button"
205onClick={onRemove}
206>
212213function UploadButton ({
214images,
215setImages,
216disabled,
217}: {
218images: (string|null)[];
219setImages: (images: (string|null)[]) => void;
220disabled: boolean;
221}) {
226<button
227type="button"
228title="Upload image"
229disabled={disabled}
230onClick={e => {
234<PlusIcon />
235<div className="sr-only">
236Upload image
237</div>
238</button>
243onChange={e => {
244if (e.target.files) {
245processFiles(Array.from(e.target.files), images, setImages);
246}
247}}
NPLLMProjectsRoute.tsx7 matches
42user: {
43username: string;
44profileImageUrl: string | null;
45};
46project: any;
48return (
49<div className="card">
50{project.imageUrl ? (
51<img src={project.imageUrl} className="card-image" />
52) : user.profileImageUrl ? (
53<div className="card-image">
54<img
55src={user.profileImageUrl}
56width="48"
57height="48"
60</div>
61) : (
62<div className="card-image placeholder" />
63)}
64<div className="card-body">
NPLLMuseChatLogic.ts4 matches
7branchId: string | undefined;
8selectedFiles: string[];
9images: (string | null)[];
10soundEnabled: boolean;
11}
17// bearerToken,
18selectedFiles,
19images,
20soundEnabled,
21}: UseChatLogicProps) {
40branchId,
41selectedFiles,
42images: images
43.filter((img): img is string => {
44const isValid = typeof img === "string" && img.startsWith("data:");
45if (!isValid && img !== null) {
46console.warn(
47"Invalid image format:",
48img?.substring(0, 50) + "..."
49);
12export const PROMPT_IMAGE_LIMIT = 5;
34export const processFiles = async (files: File[], images: (string | null)[], setImages: (images: (string | null)[]) => void) => {
5const imageFiles = files.filter(file => file.type.startsWith('image/'));
6const filesToProcess = imageFiles.slice(0, PROMPT_IMAGE_LIMIT - images.filter(Boolean).length);
78if (filesToProcess.length === 0) return;
910const newImages = [...images, ...Array(filesToProcess.length).fill(null)];
11setImages(newImages);
1213const processedImages = await Promise.all(
14filesToProcess.map(async (file) => {
15return await readFileAsDataURL(file);
17);
1819const updatedImages = [...images];
20processedImages.forEach((dataUrl, index) => {
21updatedImages[images.length + index] = dataUrl;
22});
2324setImages(updatedImages.slice(0, PROMPT_IMAGE_LIMIT));
25};
2630reader.onload = () => {
31const result = reader.result as string;
32console.log("Image loaded, size:", result.length, "bytes");
33resolve(result);
34};