Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
95b13a6
feat(chat): add types, llm service, and auto-mode rotation
1amKhush May 18, 2026
59f06e2
feat(chat): add indexeddb conversation persistence
1amKhush May 18, 2026
195a371
feat(chat): add collapsible sidebar and conversation list
1amKhush May 18, 2026
50e7f64
feat(chat): add chat components with streaming and markdown
1amKhush May 18, 2026
b20f931
feat(chat): add provider and model comboboxes
1amKhush May 18, 2026
4a5296e
feat(chat): add /chat route and navigation
1amKhush May 18, 2026
1ab7bfa
chore(chat): polish dark mode, responsive, and add changeset
1amKhush May 18, 2026
262f342
fix(chat): address PR review comments and improve stability
1amKhush May 19, 2026
4c2ac60
fix(chat): resolve sidebar collapse, DataCloneError, and empty state …
1amKhush May 19, 2026
1f3ca52
fix(chat): complete remaining audit items and correct compilation errors
1amKhush May 19, 2026
9890be1
fix(chat): elegantly abort in-flight stream on unmount or activeId ch…
1amKhush May 19, 2026
7099944
fix(chat): remove IDB deadlocks causing UI hangs
1amKhush May 19, 2026
aea9913
fix(chat): remove svelte state infinite loop crashing UI hydration
1amKhush May 19, 2026
95528d6
fix(chat): hide sidebar content when collapsed to prevent overlap
1amKhush May 19, 2026
6976f85
fix(chat): make auto-rotator handle 5xx server errors
1amKhush May 19, 2026
19a7633
fix(chat): handle rejected promises gracefully on conversation update
1amKhush May 19, 2026
fb712ba
fix(chat): lock viewport height to prevent input bar from overflowing…
1amKhush May 19, 2026
714a663
fix(chat): remove svelte state proxy from LLMService to prevent silen…
1amKhush May 19, 2026
2e8473b
fix(chat): solve svelte 5 state proxy crash & dynamic component rende…
1amKhush May 20, 2026
d49f7f5
fix(chat): remove promptSeed and conversationToken from reactive stat…
1amKhush May 20, 2026
ef644c2
chore(deps): bump openai from ^4.104.0 to ^6.38.0
1amKhush May 21, 2026
4adb1dc
feat(chat): implement premium chat UI refinements, responsive layouts…
1amKhush May 21, 2026
55ffc98
fix(ui): resolve chat bubble code block overflow and restrict viewpor…
1amKhush May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/chat-phase-one.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'contextvm-site': minor
---

Add the phase-one chat workspace with OpenRouter auto mode, provider and model configuration, streaming chat, and persistent conversations.
3 changes: 3 additions & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
"marked": "^17.0.5",
"mode-watcher": "^1.1.0",
"nostr-tools": "^2.23.3",
"openai": "^6.38.0",
"rxjs": "^7.8.2",
"zod": "^4.3.6"
}
Expand Down
23 changes: 23 additions & 0 deletions src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@

pre {
@apply overflow-x-auto rounded-lg bg-muted p-4;
max-width: 100%;
}

blockquote {
Expand Down Expand Up @@ -435,6 +436,28 @@
animation: fade-in-up 0.8s ease-out;
}

/* ============================================
Chat Bubble Overflow Containment
============================================ */

/* Force code blocks inside prose containers to respect parent width.
<pre> has an intrinsic min-width equal to content; this resets it. */
.prose pre,
.prose .code-block {
min-width: 0;
max-width: 100%;
}

.prose .code-block > div {
min-width: 0;
max-width: 100%;
}

/* Code blocks inside chat bubbles: force the scrollable container
to compute its width from the bubble, not from its content.
The key trick is width:0 + min-width:100% on the scroll wrapper,
applied via inline styles in ChatBubble.svelte's renderer. */

/* ============================================
Mobile Optimizations
============================================ */
Expand Down
32 changes: 32 additions & 0 deletions src/lib/components/chat/AutoModeBanner.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<script lang="ts">
import KeyRoundIcon from '@lucide/svelte/icons/key-round';
import SparklesIcon from '@lucide/svelte/icons/sparkles';

let { usingDefaultKey = false }: { usingDefaultKey?: boolean } = $props();
</script>

<div
class="flex flex-col gap-3 rounded-lg border border-sidebar-border bg-sidebar-accent/45 px-3 py-2.5 text-sm sm:flex-row sm:items-center sm:justify-between"
>
<div class="flex min-w-0 items-start gap-2.5">
<div
class="mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-background/70 text-primary"
>
<SparklesIcon class="h-4 w-4" />
</div>
<div class="min-w-0">
<p class="font-medium text-foreground">OpenRouter auto mode</p>
<p class="text-xs leading-5 text-muted-foreground">
Free models rotate automatically. Add your own key for steadier limits.
</p>
</div>
</div>
{#if usingDefaultKey}
<div
class="inline-flex w-fit items-center gap-1.5 rounded-md border border-border bg-background/70 px-2 py-1 text-xs text-muted-foreground"
>
<KeyRoundIcon class="h-3.5 w-3.5" />
Bundled public key
</div>
{/if}
</div>
Loading