Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 0 additions & 3 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -223,14 +223,11 @@ RESPONSE_MAX_TOOL_DEPTH=50
RESPONSE_TOOL_TIMEOUT=300s
RESPONSE_LLM_DISABLE_CUSTOM_TEMPERATURE=false
RESPONSE_LLM_STREAM_MODE=auto
SLIDE_RENDERER_SCRIPT=
SLIDE_RENDERER_ENABLED=true
SKILL_EXECUTION_ENABLED=true
SKILL_EXECUTION_TIMEOUT=120s
SKILL_MAX_FILE_SIZE=52428800
SKILL_MAX_CODE_FIX_RETRIES=3
SKILL_MAX_INSTALL_RETRIES=3
SKILL_SLIDES_ENABLED=true
SKILL_DOCS_ENABLED=true
SKILL_PDFS_ENABLED=true
SKILL_SPREADSHEETS_ENABLED=true
Expand Down
5 changes: 1 addition & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ API_TEST_BASE_FLAGS := --env-file tests/e2e/.env \
# Full flags with default auth mode
API_TEST_FLAGS := $(API_TEST_BASE_FLAGS) --auto-auth $(AUTH_MODE) --debug

.PHONY: test-all test-auth test-conversation test-conversation-ocr test-response test-response-aio test-response-mcp test-request test-model test-media test-mcp test-mcp-agents test-user-management test-model-prompts test-image test-agent-slide test-messages test-dev
.PHONY: test-all test-auth test-conversation test-conversation-ocr test-response test-response-aio test-response-mcp test-request test-model test-media test-mcp test-mcp-agents test-user-management test-model-prompts test-image test-messages test-dev

test-all:
$(API_TEST) $(COLLECTION_FILES) $(API_TEST_FLAGS) --timeout-request 120000
Expand All @@ -667,9 +667,6 @@ test-response-aio:
test-response-mcp:
$(API_TEST) $(COLLECTIONS_DIR)/response-mcp.postman.json $(API_TEST_FLAGS) --timeout-request 120000

test-agent-slide:
$(API_TEST) $(COLLECTIONS_DIR)/response-agent-slide.postman.json $(API_TEST_FLAGS) --timeout-request 900000

test-request:
powershell -ExecutionPolicy Bypass -File ./tools/jan-cli.ps1 request run tests/requests/response-api-test.json --debug --full-output

Expand Down
2 changes: 1 addition & 1 deletion apps/web/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ COPY --from=build /app/apps/web/dist /usr/share/nginx/html

# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=40s \
CMD wget -q --spider http://localhost:3001/health || exit 1
CMD wget -q --spider http://127.0.0.1:3001/health || exit 1

EXPOSE 3001

Expand Down
17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-1.svg

This file was deleted.

17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-2.svg

This file was deleted.

17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-3.svg

This file was deleted.

17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-4.svg

This file was deleted.

17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-5.svg

This file was deleted.

17 changes: 0 additions & 17 deletions apps/web/public/slides/slide-6.svg

This file was deleted.

2 changes: 1 addition & 1 deletion apps/web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ function AgentModeHero({ phrase }: { phrase: string }) {
transition={{ duration: 0.5, delay: 0.2 }}
className="text-sm text-muted-foreground mt-2"
>
I can browse, search, code, and create slides for you
I can browse, search, and code for you
</motion.p>
</div>
);
Expand Down
22 changes: 3 additions & 19 deletions apps/web/src/components/artifacts/artifact-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
MoreVertical,
Download,
Eye,
Presentation,
FileText,
FileSearch,
Code,
Expand Down Expand Up @@ -71,8 +70,6 @@ interface ArtifactCardProps {

function getArtifactIcon(contentType: string) {
switch (contentType) {
case "slides":
return Presentation;
case "document":
return FileText;
case "research":
Expand All @@ -95,8 +92,6 @@ function getArtifactIcon(contentType: string) {

function getContentTypeLabel(contentType: string): string {
switch (contentType) {
case "slides":
return "Presentation";
case "document":
return "Document";
case "research":
Expand Down Expand Up @@ -173,11 +168,6 @@ export function ArtifactCard({ artifact }: ArtifactCardProps) {

const relativeDate = formatRelativeTime(artifact.updated_at);

// Get thumbnail from metadata if available (for slides)
const metadata = artifact.metadata as Record<string, unknown> | undefined;
const slidesImages = metadata?.slides_images as Array<{ thumb: string }> | undefined;
const thumbnailUrl = slidesImages?.[0]?.thumb;

// Check if this artifact should show a markdown preview
const isMarkdown = artifact.content_type === "markdown" ||
artifact.content_type === "research" ||
Expand All @@ -186,7 +176,7 @@ export function ArtifactCard({ artifact }: ArtifactCardProps) {
// Check if this artifact has a supported viewer
// Documents only have viewer if they're text-based (not PDF/DOCX)
const hasViewer = (() => {
if (["slides", "research", "markdown", "html", "code", "image"].includes(artifact.content_type)) {
if (["research", "markdown", "html", "code", "image"].includes(artifact.content_type)) {
return true;
}
if (artifact.content_type === "document" && artifact.mime_type?.startsWith("text/")) {
Expand Down Expand Up @@ -222,13 +212,7 @@ export function ArtifactCard({ artifact }: ArtifactCardProps) {
>
{/* Thumbnail/Preview Area */}
<div className="h-32 bg-muted/30 rounded-t-xl flex items-center justify-center overflow-hidden relative">
{thumbnailUrl ? (
<img
src={thumbnailUrl}
alt={artifact.title}
className="w-full h-full object-cover"
/>
) : markdownPreview ? (
{markdownPreview ? (
<div className="w-full h-full p-3 overflow-hidden">
<div className="prose prose-sm dark:prose-invert max-w-none
[&>*]:!my-1 [&>*]:!leading-snug
Expand All @@ -247,7 +231,7 @@ export function ArtifactCard({ artifact }: ArtifactCardProps) {
<Icon className="size-10 text-muted-foreground/50" />
)}
{/* Gradient overlay for markdown preview */}
{markdownPreview && !thumbnailUrl && (
{markdownPreview && (
<div className="absolute inset-x-0 bottom-0 h-10 bg-gradient-to-t from-muted/80 to-transparent" />
)}
</div>
Expand Down
1 change: 0 additions & 1 deletion apps/web/src/components/artifacts/artifact-filter-tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { cn } from "@/lib/utils";

const CONTENT_TYPE_FILTERS: Array<{ value: ContentTypeFilter; label: string }> = [
{ value: "all", label: "All" },
{ value: "slides", label: "Presentations" },
{ value: "document", label: "Documents" },
{ value: "research", label: "Research" },
{ value: "code", label: "Code" },
Expand Down
26 changes: 2 additions & 24 deletions apps/web/src/components/artifacts/artifact-gallery.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { useEffect, useState, useCallback } from "react";
import { useEffect, useState } from "react";
import { useArtifactGalleryStore } from "@/stores/artifact-gallery-store";
import { artifactService } from "@/services/artifact-service";
import { ArtifactCard } from "./artifact-card";
import { ArtifactFilterTabs } from "./artifact-filter-tabs";
import { ArtifactCategoryPicker } from "./artifact-category-picker";
import { SlideViewer } from "@/components/misc/slide-viewer";
import { MdViewer } from "@/components/misc/md-viewer";
import { HtmlViewer } from "@/components/misc/html-viewer";
import { ImageViewer } from "@/components/misc/image-viewer";
Expand Down Expand Up @@ -48,17 +47,6 @@ export function ArtifactGallery() {
}
}, [debouncedSearch, searchQuery, setSearchQuery, fetchArtifacts]);

// Parse slide images from artifact metadata if available
const getSlideImages = useCallback(() => {
if (!selectedArtifact?.metadata) return [];
const metadata = selectedArtifact.metadata as Record<string, unknown>;
const slidesImages = metadata.slides_images as Array<{ id: string; url: string; thumb: string }> | undefined;
return slidesImages?.map((img) => ({
id: img.id,
thumb: img.thumb || img.url,
})) || [];
}, [selectedArtifact]);

return (
<div className="h-full flex flex-col">
{/* Header */}
Expand Down Expand Up @@ -106,7 +94,7 @@ export function ArtifactGallery() {
</div>
<h3 className="text-lg font-medium mb-2">No artifacts yet</h3>
<p className="text-muted-foreground mb-4 max-w-sm">
Create your first artifact by starting a new conversation and asking for slides, documents, or other content.
Create your first artifact by starting a new conversation and asking for documents or other content.
</p>
<Button onClick={openCategoryPicker} className="gap-1.5">
<Plus className="size-4" />
Expand Down Expand Up @@ -140,16 +128,6 @@ export function ArtifactGallery() {
/>

{/* Viewer Modals */}
{isViewerOpen && selectedArtifact && selectedArtifact.content_type === "slides" && (
<SlideViewer
slides={getSlideImages()}
title={selectedArtifact.title}
onDownload={() => artifactService.download(selectedArtifact.id, selectedArtifact.title)}
conversationId={selectedArtifact.conversation_id}
onClose={closeViewer}
/>
)}

{isViewerOpen && selectedArtifact && (
selectedArtifact.content_type === "research" ||
selectedArtifact.content_type === "markdown" ||
Expand Down
Loading
Loading