From 394f1ed37ce860da6fdc385769bf29f9737105cd Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Thu, 4 Jun 2026 21:21:20 +0900 Subject: chore: genesis — remove all files to rebuild from scratch (arch rewrite) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/lib/components/AgentBuilder.svelte | 806 --------------------- .../src/lib/components/CacheRatePanel.svelte | 124 ---- .../frontend/src/lib/components/ChatInput.svelte | 396 ---------- .../frontend/src/lib/components/ChatMessage.svelte | 148 ---- .../frontend/src/lib/components/ChatPanel.svelte | 181 ----- .../frontend/src/lib/components/ClaudeReset.svelte | 375 ---------- .../frontend/src/lib/components/ConfigPanel.svelte | 251 ------- .../src/lib/components/ContextWindowPanel.svelte | 85 --- .../frontend/src/lib/components/DebugPanel.svelte | 35 - packages/frontend/src/lib/components/Header.svelte | 27 - .../src/lib/components/HotReloadIndicator.svelte | 35 - .../frontend/src/lib/components/KeyUsage.svelte | 477 ------------ .../src/lib/components/MarkdownRenderer.svelte | 174 ----- .../src/lib/components/ModelSelector.svelte | 636 ---------------- .../frontend/src/lib/components/ModelStatus.svelte | 356 --------- .../src/lib/components/PermissionPrompt.svelte | 100 --- .../src/lib/components/SettingsPanel.svelte | 643 ---------------- .../src/lib/components/SidebarPanel.svelte | 220 ------ .../src/lib/components/SkillsBrowser.svelte | 317 -------- .../src/lib/components/SystemPromptPanel.svelte | 61 -- packages/frontend/src/lib/components/TabBar.svelte | 234 ------ .../src/lib/components/TaskListPanel.svelte | 80 -- .../src/lib/components/ToolCallDisplay.svelte | 140 ---- .../src/lib/components/ToolPermissions.svelte | 185 ----- 24 files changed, 6086 deletions(-) delete mode 100644 packages/frontend/src/lib/components/AgentBuilder.svelte delete mode 100644 packages/frontend/src/lib/components/CacheRatePanel.svelte delete mode 100644 packages/frontend/src/lib/components/ChatInput.svelte delete mode 100644 packages/frontend/src/lib/components/ChatMessage.svelte delete mode 100644 packages/frontend/src/lib/components/ChatPanel.svelte delete mode 100644 packages/frontend/src/lib/components/ClaudeReset.svelte delete mode 100644 packages/frontend/src/lib/components/ConfigPanel.svelte delete mode 100644 packages/frontend/src/lib/components/ContextWindowPanel.svelte delete mode 100644 packages/frontend/src/lib/components/DebugPanel.svelte delete mode 100644 packages/frontend/src/lib/components/Header.svelte delete mode 100644 packages/frontend/src/lib/components/HotReloadIndicator.svelte delete mode 100644 packages/frontend/src/lib/components/KeyUsage.svelte delete mode 100644 packages/frontend/src/lib/components/MarkdownRenderer.svelte delete mode 100644 packages/frontend/src/lib/components/ModelSelector.svelte delete mode 100644 packages/frontend/src/lib/components/ModelStatus.svelte delete mode 100644 packages/frontend/src/lib/components/PermissionPrompt.svelte delete mode 100644 packages/frontend/src/lib/components/SettingsPanel.svelte delete mode 100644 packages/frontend/src/lib/components/SidebarPanel.svelte delete mode 100644 packages/frontend/src/lib/components/SkillsBrowser.svelte delete mode 100644 packages/frontend/src/lib/components/SystemPromptPanel.svelte delete mode 100644 packages/frontend/src/lib/components/TabBar.svelte delete mode 100644 packages/frontend/src/lib/components/TaskListPanel.svelte delete mode 100644 packages/frontend/src/lib/components/ToolCallDisplay.svelte delete mode 100644 packages/frontend/src/lib/components/ToolPermissions.svelte (limited to 'packages/frontend/src/lib/components') diff --git a/packages/frontend/src/lib/components/AgentBuilder.svelte b/packages/frontend/src/lib/components/AgentBuilder.svelte deleted file mode 100644 index f1c9cdf..0000000 --- a/packages/frontend/src/lib/components/AgentBuilder.svelte +++ /dev/null @@ -1,806 +0,0 @@ - - - - -
- -
-

Agent Settings

- -
- -
- {#if error} -
{error}
- {/if} - - {#if editing} - -
-
-

{editingSlug ? "Edit Agent" : "New Agent"}

- - {#if formError} -
{formError}
- {/if} - - -
- - - {#if formName} - slug: {slugify(formName)} - {/if} -
- -
- -
- - -
- - -
- -
- - -
- - -
- - -
- -
- - {#if formCwd.trim()} - {#if cwdExists === true} - - {:else if cwdExists === false} - - {:else} - - {/if} - {/if} -
- {#if cwdExists === false && formCwd.trim()} - Directory will be created automatically on first message. - {/if} - {#if cwdResolved && formCwd.trim() && cwdResolved !== formCwd.trim()} - {cwdResolved} - {/if} - {#if !formCwd.trim()} - Absolute or relative path. Relative paths resolve against the parent agent's working directory, or the project root. - {/if} -
- - -
-
- Models * -
-
- {#each formModels as entry, i (i)} -
{ - dragIndex = i; - if (e.dataTransfer) e.dataTransfer.effectAllowed = "move"; - }} - ondragover={(e) => { - e.preventDefault(); - if (e.dataTransfer) e.dataTransfer.dropEffect = "move"; - dragOverIndex = i; - }} - ondragleave={() => { - if (dragOverIndex === i) dragOverIndex = null; - }} - ondrop={(e) => { - e.preventDefault(); - if (dragIndex !== null && dragIndex !== i) { - const reordered = [...formModels]; - const moved = reordered.splice(dragIndex, 1)[0]; - if (moved) { - reordered.splice(i, 0, moved); - formModels = reordered; - } - } - dragIndex = null; - dragOverIndex = null; - }} - ondragend={() => { dragIndex = null; dragOverIndex = null; }} - > - {i + 1} - - - - -
- {/each} -
- -
- - -
-
- Tools -
- -
- - -
-
- Skills -
- -
- - -
- {#if editingSlug && !(editingSlug === "default" && formScope === "global")} - - {:else} -
- {/if} -
- {#if saving} - Saving... - {/if} -
-
-
-
-
- {:else} - - {#if loading} -
- -
- {:else} - -
-

Global Agents

-
- {#each globalAgents as agent} - - {/each} - -
-
- - - {#if projectAgents.length > 0 || dirs.some((d) => d.scope !== "global")} -
-

Project Agents

- {#if projectAgents.length === 0} -

No project agents yet.

- {:else} -
- {#each projectAgents as agent} - - {/each} -
- {/if} -
- {/if} - {/if} - {/if} -
-
- - -{#if modelModalIndex !== null && modelModalType === "key"} - -{/if} - - -{#if modelModalIndex !== null && modelModalType === "model"} - -{/if} - - -{#if deletingAgent !== null} - {@const agentToDelete = deletingAgent} - -{/if} diff --git a/packages/frontend/src/lib/components/CacheRatePanel.svelte b/packages/frontend/src/lib/components/CacheRatePanel.svelte deleted file mode 100644 index 88985a0..0000000 --- a/packages/frontend/src/lib/components/CacheRatePanel.svelte +++ /dev/null @@ -1,124 +0,0 @@ - - -
- {#if !cacheStats || cacheStats.requests === 0} -

- No cache data yet. Send a message to a Claude model — prompt-cache usage - appears here after the first response. -

- {:else} -
-
- Cache Hit Rate - {#if tabTitle} - {tabTitle} - {/if} - {cacheStats.requests} req -
- - -
-
- Session (this tab) - {hitPct}% -
- -
- - - {#if cacheStats.last} -
-
- Last request - {lastHitPct}% -
- -
- {/if} -
- - -
-
Tokens (cumulative)
-
-
- - readCache hits - - {fmt(cacheStats.cacheReadTokens)} -
-
- - writeCache writes - - {fmt(cacheStats.cacheWriteTokens)} -
-
- - freshUncached input - - {fmt(uncached)} -
-
-
- Total input - {fmt(cacheStats.inputTokens)} -
-
- Output - {fmt(cacheStats.outputTokens)} -
-
-
- {/if} -
diff --git a/packages/frontend/src/lib/components/ChatInput.svelte b/packages/frontend/src/lib/components/ChatInput.svelte deleted file mode 100644 index f3eadf7..0000000 --- a/packages/frontend/src/lib/components/ChatInput.svelte +++ /dev/null @@ -1,396 +0,0 @@ - - -
- {#if attachmentWarning} -
- - {attachmentWarning} -
- {/if} - -
- - - -
- - -
- - - {#if agentStatus === "running"} - - {:else if agentStatus === "error"} - - - - - - {:else} - - - - {/if} - - - - {#if usage.percent !== null} - - {:else} - - - {/if} - - - - {#if hasUsage} - {fmtCompact(usage.current)}{#if usage.max !== null} / {fmtCompact(usage.max)}{/if} - {#if usage.percent !== null} - · {usage.percent.toFixed(1)}% - {/if} - {:else} - — tokens - {/if} - -
-
diff --git a/packages/frontend/src/lib/components/ChatMessage.svelte b/packages/frontend/src/lib/components/ChatMessage.svelte deleted file mode 100644 index 54e99c8..0000000 --- a/packages/frontend/src/lib/components/ChatMessage.svelte +++ /dev/null @@ -1,148 +0,0 @@ - - -{#snippet renderChunks(chunks: Chunk[], streaming: boolean | undefined)} - {#each chunks as chunk, i (chunkKey(chunk, i))} - {#if chunk.type === "text"} - - {:else if chunk.type === "thinking"} - - {#if chunk.text.length > 0} -
- -
Thinking...
-
-

{chunk.text}

-
-
- {/if} - {:else if chunk.type === "tool-batch"} - {#each chunk.calls as call (call.id)} - - {/each} - {:else if chunk.type === "error"} -
-
- {chunk.message} - {#if chunk.statusCode !== undefined} - status {chunk.statusCode} - {/if} -
-
- {:else if chunk.type === "system"} -
- {SYSTEM_KIND_LABEL[chunk.kind]}: - {chunk.text} -
- {/if} - {/each} -{/snippet} - -{#if isSystem} -
-
- {@render renderChunks(message.chunks, false)} -
-
-{:else if !isUser && !hasRenderableContent} - -{:else} -
-
- {@render renderChunks(message.chunks, message.isStreaming)} - {#if message.isStreaming} - - {/if} -
- {#if isQueued} -
- queued - -
- {/if} -
-{/if} diff --git a/packages/frontend/src/lib/components/ChatPanel.svelte b/packages/frontend/src/lib/components/ChatPanel.svelte deleted file mode 100644 index ee1b8ef..0000000 --- a/packages/frontend/src/lib/components/ChatPanel.svelte +++ /dev/null @@ -1,181 +0,0 @@ - - -
- -
-
{ - isAutoScrolling = false; - }} - > - {#if isLoadingMore} -
Loading earlier messages...
- {/if} - {#if compactingSource || compactionError} -
- {#if compactionError} -
Compaction failed
-
{compactionError}
-
Close this tab to dismiss — your conversation was not changed.
- {:else} - -
Please wait, compacting conversation…
-
You can cancel by closing this tab.
- {/if} -
- {:else if renderGroups.length === 0} -
- Send a message to start a conversation -
- {/if} - {#if !compactingSource && !compactionError} - {#each keyedMessages as { m, key } (key)} - - {/each} - {/if} -
- - - -
-
diff --git a/packages/frontend/src/lib/components/ClaudeReset.svelte b/packages/frontend/src/lib/components/ClaudeReset.svelte deleted file mode 100644 index eea8744..0000000 --- a/packages/frontend/src/lib/components/ClaudeReset.svelte +++ /dev/null @@ -1,375 +0,0 @@ - - -
-
Claude Wake Schedule
- - -
- AM -
-
- {#each amRow1 as hour} - - {/each} -
-
- {#each amRow2 as hour} - - {/each} -
-
-
- - -
- PM -
-
- {#each pmRow1 as hour} - - {/each} -
-
- {#each pmRow2 as hour} - - {/each} -
-
-
- - - {#if markedHours.length > 0} -
- {#each markedHours as hour} -
- {formatHour(hour)} {hour < 12 ? "AM" : "PM"} - Probes {probeLabels} → reset by {formatAmPm(resetHour(hour))} -
- {/each} -
- {:else} -

No wake hours marked. Click a block to probe at {probeLabels} that hour.

- {/if} - - - {#if lastWake} -
- {lastWake.ok ? "✓" : "✗"} - Last wake {formatRelative(lastWake.firedAt, nowMs)}{lastWake.ok ? "" : ` — ${lastWake.results.find((r) => !r.ok)?.error ?? "failed"}`} -
- {/if} - {#if pendingRetry} -
- Retrying ({pendingRetry.retriesLeft} left, next {formatRelative(pendingRetry.nextRetryAt, nowMs)}) -
- {/if} -
diff --git a/packages/frontend/src/lib/components/ConfigPanel.svelte b/packages/frontend/src/lib/components/ConfigPanel.svelte deleted file mode 100644 index f517d28..0000000 --- a/packages/frontend/src/lib/components/ConfigPanel.svelte +++ /dev/null @@ -1,251 +0,0 @@ - - -
- - Configuration - {#if modelCount > 0 || keyCount > 0} - {modelCount} models - {keyCount} keys - {/if} - {#if loading} - - {/if} - - -
- {#if error} -
- Failed to load config: {error} -
- {/if} - -
- -
- - - {#if configData?.agents && Object.keys(configData.agents).length > 0} -
-
Agent Templates
- {#each Object.entries(configData.agents) as [name, template]} -
-
- {name} - {#if template.model_tag} - {template.model_tag} - {/if} -
- {#if template.description} -

{template.description}

- {/if} - {#if template.tools && template.tools.length > 0} -
- {#each template.tools as tool} - {tool} - {/each} -
- {/if} -
- {/each} -
- {/if} - - - {#if modelsData?.models && modelsData.models.length > 0} -
-
Models
- {#each modelsData.models as model} -
- {model.id} - {#if model.provider} - {model.provider} - {/if} - {#if model.tags && model.tags.length > 0} - {#each model.tags as tag} - {tag} - {/each} - {/if} -
- {/each} -
- {/if} - - - {#if modelsData?.keys && modelsData.keys.length > 0} -
-
API Keys
- {#each modelsData.keys as key} -
-
- {key.id} - {#if key.provider} - {key.provider} - {/if} - {#if key.status === "exhausted"} - exhausted - {:else} - active - {/if} -
- {#if key.status === "exhausted" && key.lastError} -

{key.lastError}

- {/if} - {#if key.exhaustedAt} -

Since {formatDate(key.exhaustedAt)}

- {/if} -
- {/each} -
- {/if} - - - {#if configData?.fallback && configData.fallback.length > 0} -
-
Fallback Order
-
    - {#each configData.fallback as keyId, i} -
  1. - {i + 1} - {keyId} -
  2. - {/each} -
-
- {/if} - - - {#if configData?.permissions && Object.keys(configData.permissions).length > 0} -
-
Permissions
- {#each permissionEntries(configData.permissions) as entry} -
- {entry.name} - {#if isSimpleRule(entry.value)} - {entry.value.action} - {:else if isPatternRule(entry.value)} - {#each Object.entries(entry.value) as [pattern, rule]} -
- {pattern} - {#if typeof rule === "object" && rule !== null && "action" in rule} - {(rule as { action: string }).action} - {/if} -
- {/each} - {:else} - {JSON.stringify(entry.value)} - {/if} -
- {/each} -
- {/if} - - {#if !loading && !error && !configData && !modelsData} -

No configuration loaded.

- {/if} -
-
diff --git a/packages/frontend/src/lib/components/ContextWindowPanel.svelte b/packages/frontend/src/lib/components/ContextWindowPanel.svelte deleted file mode 100644 index 6c7de05..0000000 --- a/packages/frontend/src/lib/components/ContextWindowPanel.svelte +++ /dev/null @@ -1,85 +0,0 @@ - - -
- {#if !hasUsage} -

- No context data yet. Send a message — the current context size appears - here after the first response. -

- {:else} -
-
- Context Window - {#if tabTitle} - {tabTitle} - {/if} - {#if usage.percent !== null} - {usage.percent.toFixed(2)}% - {/if} -
- - -
- {fmt(usage.current)} - {#if usage.max !== null} - / {fmt(usage.max)} - {/if} - tokens -
- - {#if usage.percent !== null} - - {:else} -

- Max context size unknown for this model. -

- {/if} - - {#if modelId} -
- {modelId} -
- {/if} -
- -

- Current context = the most recent request's prompt + output (what the - model actually held in its window that turn). Grows as the conversation - gets longer. Resets on reload. -

- {/if} -
diff --git a/packages/frontend/src/lib/components/DebugPanel.svelte b/packages/frontend/src/lib/components/DebugPanel.svelte deleted file mode 100644 index aea1ccb..0000000 --- a/packages/frontend/src/lib/components/DebugPanel.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -
-
Debug
- -
-

Conversation

-

- Copy a structured plain-text dump of the active tab's conversation - (chunk shape included) for bug reports. -

- -
-
diff --git a/packages/frontend/src/lib/components/Header.svelte b/packages/frontend/src/lib/components/Header.svelte deleted file mode 100644 index 72a6ebf..0000000 --- a/packages/frontend/src/lib/components/Header.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/packages/frontend/src/lib/components/HotReloadIndicator.svelte b/packages/frontend/src/lib/components/HotReloadIndicator.svelte deleted file mode 100644 index 8d37578..0000000 --- a/packages/frontend/src/lib/components/HotReloadIndicator.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -{#if visible} -
- - Config reloaded -
-{/if} diff --git a/packages/frontend/src/lib/components/KeyUsage.svelte b/packages/frontend/src/lib/components/KeyUsage.svelte deleted file mode 100644 index 7c0cadc..0000000 --- a/packages/frontend/src/lib/components/KeyUsage.svelte +++ /dev/null @@ -1,477 +0,0 @@ - - -
- {#if keys.length === 0} -

No keys available.

- {:else} -
- - {#if claudeAccounts.length > 0 || claudeLoading || claudeError} -
-
- Claude - anthropic - {#if claudeLoading} - - {/if} -
- - {#if claudeAccounts.length === 0 && claudeLoading} -
- Loading... -
- {:else if claudeAccounts.length === 0 && claudeError} - - {:else} - {#if claudeError} - - {/if} - {#each claudeAccounts as acct, idx (acct.source)} - {#if idx > 0} -
- {/if} -
-
- {acct.label} - {#if acct.subscriptionType} - {acct.subscriptionType} - {/if} -
- {#if acct.error} -

{acct.error}

- {/if} - {#if hasBucketData(acct.fiveHour)} - {@const b = acct.fiveHour!} - {@const u = b.utilization ?? 0} - {@const p = Math.round(u * 100)} - {@const tp = cycleElapsedPct(b.resetsAt, FIVE_HOUR_MS)} -
-
- 5-Hour - {p}% -
-
- - {#if tp >= 0} -
- {/if} -
- {#if b.resetsAt} - Resets: {formatDate(b.resetsAt)} - {/if} -
- {/if} - {#if hasBucketData(acct.sevenDay)} - {@const b = acct.sevenDay!} - {@const u = b.utilization ?? 0} - {@const p = Math.round(u * 100)} - {@const tp = cycleElapsedPct(b.resetsAt, SEVEN_DAY_MS)} -
-
- Weekly - {p}% -
-
- - {#if tp >= 0} -
- {/if} -
- {#if b.resetsAt} - Resets: {formatDate(b.resetsAt)} - {/if} -
- {/if} -
- {/each} - {/if} -
- {/if} - - - {#each nonClaudeEntries as entry (entry.keyId)} -
-
- {formatKeyId(entry.keyId)} - {entry.provider} - {#if entry.loading} - - {/if} -
- - {#if entry.loading && !entry.data} -
- - Loading... -
- {:else} - {#if entry.error} - - {/if} - {#if !entry.data} -

No data.

- - {:else if entry.data.provider === "opencode-go"} - {#if entry.data.unavailable} -

Usage data not available. Set OPENCODE_COOKIE env var to enable.

- {#if entry.data.limits} -
- Limits: {entry.data.limits.fiveHour}/5h · {entry.data.limits.weekly}/wk · {entry.data.limits.monthly}/mo -
- {/if} - {#if entry.data.consoleUrl} - - View usage on opencode.ai - - {/if} - {:else} - {#if hasBucketData(entry.data.fiveHour)} - {@const b = entry.data.fiveHour!} - {@const u = b.utilization ?? 0} - {@const p = Math.round(u * 100)} - {@const tp = cycleElapsedPct(b.resetsAt, FIVE_HOUR_MS)} -
-
- 5-Hour - {p}% -
-
- - {#if tp >= 0} -
- {/if} -
- {#if b.resetsAt} - Resets: {formatDate(b.resetsAt)} - {/if} -
- {/if} - {#if hasBucketData(entry.data.weekly)} - {@const b = entry.data.weekly!} - {@const u = b.utilization ?? 0} - {@const p = Math.round(u * 100)} - {@const tp = cycleElapsedPct(b.resetsAt, SEVEN_DAY_MS)} -
-
- Weekly - {p}% -
-
- - {#if tp >= 0} -
- {/if} -
- {#if b.resetsAt} - Resets: {formatDate(b.resetsAt)} - {/if} -
- {/if} - {#if hasBucketData(entry.data.monthly)} - {@const b = entry.data.monthly!} - {@const u = b.utilization ?? 0} - {@const p = Math.round(u * 100)} - {@const tp = cycleElapsedPct(b.resetsAt, THIRTY_DAY_MS)} -
-
- Monthly - {p}% -
-
- - {#if tp >= 0} -
- {/if} -
- {#if b.resetsAt} - Resets: {formatDate(b.resetsAt)} - {/if} -
- {/if} - {/if} - - {:else if entry.data.provider === "github-copilot"} - {@const p = Math.round(entry.data.percentUsed ?? 0)} -
-
- - {#if entry.data.tokensConsumed !== undefined && entry.data.tokensRemaining !== undefined} - {entry.data.tokensConsumed.toLocaleString()} / {(entry.data.tokensConsumed + entry.data.tokensRemaining).toLocaleString()} tokens - {:else if entry.data.plan} - {entry.data.plan} - {:else} - Usage - {/if} - - {p}% -
- - {#if entry.data.resetAt} - Resets: {formatDate(entry.data.resetAt)} - {/if} -
- {:else if entry.data.provider === "google"} -
- - {#if entry.data.currentUsage} - {@const u = entry.data.currentUsage} -
-
- Current - {u.percentUsed}% -
- - {#if u.resetsAt} - Resets: {u.resetsAt} - {/if} -
- {/if} - {#if entry.data.weeklyUsage} - {@const w = entry.data.weeklyUsage} -
-
- Weekly - {w.percentUsed}% -
- - {#if w.resetsAt} - Resets: {w.resetsAt} - {/if} -
- {/if} - - {#if !entry.data.currentUsage && entry.data.models && entry.data.models.length > 0} - {@const m = entry.data.models[0]} -
- Models - {entry.data.models.length} available -
- {#if m && m.rpm > 0} -
- RPM - {m.rpm} -
- {/if} - {#if m && m.requestsPerDay > 0} -
- RPD - {m.requestsPerDay.toLocaleString()} -
- {/if} - {#if !entry.data.currentUsage} -

Set GEMINI_COOKIE (__Secure-1PSID) for usage %

- {/if} - {/if} -
- {/if} - {/if} -
- {/each} -
- {/if} -
diff --git a/packages/frontend/src/lib/components/MarkdownRenderer.svelte b/packages/frontend/src/lib/components/MarkdownRenderer.svelte deleted file mode 100644 index de202b6..0000000 --- a/packages/frontend/src/lib/components/MarkdownRenderer.svelte +++ /dev/null @@ -1,174 +0,0 @@ - - -
- {@html html} -
diff --git a/packages/frontend/src/lib/components/ModelSelector.svelte b/packages/frontend/src/lib/components/ModelSelector.svelte deleted file mode 100644 index 64036d4..0000000 --- a/packages/frontend/src/lib/components/ModelSelector.svelte +++ /dev/null @@ -1,636 +0,0 @@ - - - - -
- -
- -
- { - const val = e.currentTarget.value.trim(); - onWorkingDirectoryChange(val || null); - }} - /> - {#if workingDirectory} - {#if cwdExists === true} - - {:else if cwdExists === false} - - {:else} - - {/if} - {/if} -
-
- - -
- -
- - -
- - - -
- - {#if mode === "manual"} -
- Key - -
- -
- Model - -
- - {#if activeModelId} -
- Thinking - -
- {/if} - {:else if mode === "subagent"} - - {@const subModels = activeAgentModels ?? []} - {@const hasSubModels = subModels.length > 1} - {@const subActiveIdx = subModels.findIndex( - (m) => m.key_id === activeKeyId && m.model_id === activeModelId, - )} -
-
- SubAgent - {activeAgentSlug} -
-
- Key - {activeKeyId ?? "default"} -
-
- Model - {activeModelId ?? "default"} -
- {#if hasSubModels} - {@const displayIdx = subActiveIdx >= 0 ? subActiveIdx : 0} -
-
Model fallback chain
- -
- {#each subModels as _, i} - {i + 1} - {/each} -
-
- {#each subModels as m, i} -
- {i + 1}. {m.key_id} / {m.model_id} - {effortLabel(m.effort)} -
- {/each} -
-
- {/if} -

This tab was spawned by a parent agent. Settings cannot be changed.

-
- {:else} - - {#if loadingAgents} -
- - Loading agents... -
- {:else if visibleAgents.length === 0} -

No agents configured.

- {:else} -
- {#each visibleAgents as agent (agent.slug + ":" + agent.scope)} - {@const isActive = activeAgentSlug === agent.slug} - {@const hasMultipleModels = agent.models.length > 1} - {@const currentIdx = isActive - ? agent.models.findIndex( - (m) => m.key_id === activeKeyId && m.model_id === activeModelId, - ) - : -1} -
{ - // Only switch agent — don't reset the slider position - onAgentChange(agent); - const cwdEl = document.getElementById("cwd-input") as HTMLInputElement | null; - if (cwdEl) cwdEl.value = agent.cwd ?? ""; - }} - onkeydown={(e) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - onAgentChange(agent); - const cwdEl = document.getElementById("cwd-input") as HTMLInputElement | null; - if (cwdEl) cwdEl.value = agent.cwd ?? ""; - } - }} - > -
- {agent.name} -
- {agent.models.length} model{agent.models.length !== 1 ? "s" : ""} - {agent.scope === "global" ? "global" : "project"} -
-
- {#if agent.description} -

{agent.description}

- {/if} - {#if isActive && hasMultipleModels} - {@const displayIdx = sliderDragging !== null ? sliderDragging : (currentIdx >= 0 ? currentIdx : 0)} - {@const displayModel = agent.models[displayIdx]} -
-
- {displayModel ? `${displayModel.key_id} / ${displayModel.model_id}` : `${activeKeyId} / ${activeModelId}`} - {effortLabel(displayModel?.effort)} -
- = 0 ? currentIdx : 0} - class="range range-xs" - step="1" - oninput={(e) => { - sliderDragging = Number(e.currentTarget.value); - }} - onchange={(e) => { - const idx = Number(e.currentTarget.value); - const m = agent.models[idx]; - if (m) onModelChange(m.key_id, m.model_id); - sliderDragging = null; - }} - onclick={(e) => e.stopPropagation()} - onkeydown={(e) => e.stopPropagation()} - /> -
- {#each agent.models as _, i} - {i + 1} - {/each} -
-
- {/if} -
- {/each} -
- {/if} - - - {/if} - - -
- -

- While this tab is idle, replays the cached conversation every {warmIntervalLabel} - so the provider cache stays warm for your next message. Warming traffic is - debug-only — it never touches history, the Cache Rate metric, or context size. -

- - {#if warm.enabled} -
- -
-
- Last request (warming) - {warm.lastPct === null ? "-%" : `${warm.lastPct}%`} -
- -
- - -
- Next warm in - - {#if warm.firing} - warming… - {:else if warmCountdown !== null} - {warmCountdown} - {:else} - — - {/if} - -
- - {#if warm.error} -
- {warm.error} -
- {/if} -
- {/if} -
-
- -{#if showKeyModal} - -{/if} - -{#if showModelModal} - -{/if} diff --git a/packages/frontend/src/lib/components/ModelStatus.svelte b/packages/frontend/src/lib/components/ModelStatus.svelte deleted file mode 100644 index 57c5efd..0000000 --- a/packages/frontend/src/lib/components/ModelStatus.svelte +++ /dev/null @@ -1,356 +0,0 @@ - - -
- {#if keys.length === 0} -

- No models configured. Using environment defaults. -

- {:else} - - {#if allActive} -
- - All keys available -
- {:else if allExhausted} -
- - All keys exhausted — waiting for refresh -
- {:else if someExhausted} -
- - - Fallback active ({activeKeys}/{totalKeys} keys available) - -
- {/if} - - - {#if currentModel} -
-

Current Model

-

{currentModel}

-
- {/if} - - - {#if importError} - - {/if} - {#if importSuccess} -
Imported credentials for {importSuccess}
- {/if} - - - {#if keys.length > 0} -
-

API Keys

-
    - {#each keys as key (key.id)} - {@const cred = credentialStatus[key.id]} -
  • -
    - - {key.status} - - {key.id} - {key.provider} - -
    - {#if key.status === "exhausted"} -
    - {#if key.lastError} -

    - {truncate(key.lastError, 80)} -

    - {/if} - {#if key.exhaustedAt !== null} -

    {timeAgo(key.exhaustedAt)}

    - {/if} -
    - {/if} - - {#if key.provider === "anthropic"} -
    - {#if cred} - - {cred.expired ? "expired" : "imported"} - - {#if cred.subscriptionType} - {cred.subscriptionType} - {/if} - {/if} - -
    - {/if} - - {#if key.provider !== "anthropic"} -
    - {#if apiKeyStatus[key.id]} - imported - {/if} - -
    - {/if} -
  • - {/each} -
-
- {/if} - {/if} - - -{#if showKeyModal} - -{/if} - -
diff --git a/packages/frontend/src/lib/components/PermissionPrompt.svelte b/packages/frontend/src/lib/components/PermissionPrompt.svelte deleted file mode 100644 index 3a67b30..0000000 --- a/packages/frontend/src/lib/components/PermissionPrompt.svelte +++ /dev/null @@ -1,100 +0,0 @@ - - - - {#if current} - {#if !showAlwaysConfirmation} - - {:else} - - {/if} - {/if} - diff --git a/packages/frontend/src/lib/components/SettingsPanel.svelte b/packages/frontend/src/lib/components/SettingsPanel.svelte deleted file mode 100644 index 8b28957..0000000 --- a/packages/frontend/src/lib/components/SettingsPanel.svelte +++ /dev/null @@ -1,643 +0,0 @@ - - -
-
Settings
- -
-

Theme

- - -
- -

Title Generation Model

-

Used to generate short titles for new tabs after the first message.

- - - - - -
- -

Conversation Compaction Model

-

Used to summarize a conversation when you compact it. If unset, the tab's own key/model is used.

- - - - - -
- -

Chat

- - -
- -

Memory

- - -
- -

Backend URL

-

API server address. Default: {config.defaultApiBase}

-
- - -
- - {#if backendUrlSaved} -

Saved. Reload the page to apply.

- {/if} - -
- -

Notifications (ntfy.sh)

-

- Push notifications to your phone when things happen here. Subscribe to your topic in the - ntfy.sh app to receive them. -

- - - - - - - -
- Notify me on: - {#each ntfyEventOrder as evType (evType)} - - {/each} -
- -
- - - Off (default): turn-completed/turn-error from subagents are suppressed. Permission prompts still fire so subagents don't silently hang. - -
- -
- - -
- {#if ntfySaveOk} -

Saved.

- {/if} - {#if ntfySaveError} -

{ntfySaveError}

- {/if} - {#if ntfyTestResult} -

{ntfyTestResult}

- {/if} -
-
diff --git a/packages/frontend/src/lib/components/SidebarPanel.svelte b/packages/frontend/src/lib/components/SidebarPanel.svelte deleted file mode 100644 index 2003856..0000000 --- a/packages/frontend/src/lib/components/SidebarPanel.svelte +++ /dev/null @@ -1,220 +0,0 @@ - - -
- {#each panels as panel, idx (panel.id)} -
-
- - {#if idx > 0} - - {/if} -
- -
- {#if panel.selected === "Chat Settings"} - - {:else if panel.selected === "Key Usage"} - - {:else if panel.selected === "Cache Rate"} - - {:else if panel.selected === "Context Window"} - - {:else if panel.selected === "Claude Reset"} - - {:else if panel.selected === "Model Status"} - - {:else if panel.selected === "Tasks"} - - {:else if panel.selected === "Config"} - - {:else if panel.selected === "Skills"} - - {:else if panel.selected === "Tools"} - - {:else if panel.selected === "Settings"} - - {:else if panel.selected === "Debug"} - - {/if} -
-
- {/each} - - -
diff --git a/packages/frontend/src/lib/components/SkillsBrowser.svelte b/packages/frontend/src/lib/components/SkillsBrowser.svelte deleted file mode 100644 index e697732..0000000 --- a/packages/frontend/src/lib/components/SkillsBrowser.svelte +++ /dev/null @@ -1,317 +0,0 @@ - - -
-
-
Skills
- {#if !loading} - {skills.length} - {/if} - {#if checkedCount > 0} - {checkedCount} {externalMode ? 'selected' : 'queued'} - {/if} - -
- - {#if !externalMode} -

Check skills to inject with your next message.

- {/if} - - {#if loading} -
- - Loading skills... -
- {:else if error} -
{error}
- {:else if skills.length === 0} -

- No skills found. Create .skills/ directories to get started. -

- {:else} -
- {#each dirGroups as group, idx (dirKey(group))} - {@const collapsed = collapsedDirs.has(dirKey(group))} - {@const hidden = isHiddenByParent(group)} - {@const prevGroup = dirGroups[idx - 1]} - {@const isNewTopLevel = idx === 0 || !prevGroup || topLevelDir(group) !== topLevelDir(prevGroup) || group.scope !== prevGroup.scope} - {#if !hidden} - {#if isNewTopLevel && idx > 0} -
- {/if} -
-
- - - - - {#if !collapsed} -
- {#each group.skills as skill (skillKey(skill))} - {@const key = skillKey(skill)} - {@const checked = isChecked(skill)} - {@const injected = isInjected(skill)} -
- - - {#if expandedSkill === key} -
- {#if loadingDetail} - - {:else if expandedDetail} -
{expandedDetail.content}
- {:else} -

Failed to load skill content.

- {/if} -
- {/if} -
- {/each} -
- {/if} -
-
- {/if} - {/each} -
- {/if} - - {#if !externalMode} - - {/if} -
diff --git a/packages/frontend/src/lib/components/SystemPromptPanel.svelte b/packages/frontend/src/lib/components/SystemPromptPanel.svelte deleted file mode 100644 index d9039f4..0000000 --- a/packages/frontend/src/lib/components/SystemPromptPanel.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - -
-
System Prompt
-

The base instructions sent to the AI at the start of every conversation. Tool descriptions are appended automatically. Changes are applied when you send your next message.

- - - - - -

Warning: changing the system prompt will reset the AI's prompt cache for active conversations, which may increase usage costs.

-
diff --git a/packages/frontend/src/lib/components/TabBar.svelte b/packages/frontend/src/lib/components/TabBar.svelte deleted file mode 100644 index 7371f7b..0000000 --- a/packages/frontend/src/lib/components/TabBar.svelte +++ /dev/null @@ -1,234 +0,0 @@ - - - - -
{ if (e.target === e.currentTarget) tabStore.createNewTab(); }} -> - -
{ if (e.target === e.currentTarget) tabStore.createNewTab(); }} - > - - - - {#each userTabs as tab, i (tab.id)} - - - {/each} - - - -
tabStore.createNewTab()} - title="Double-click to open a new tab" - >
-
-
- - -{#if hasSubagentTabs} -
-
- {#each subagentTabs as tab (tab.id)} - - - {/each} -
-
-{/if} diff --git a/packages/frontend/src/lib/components/TaskListPanel.svelte b/packages/frontend/src/lib/components/TaskListPanel.svelte deleted file mode 100644 index 1f84bb8..0000000 --- a/packages/frontend/src/lib/components/TaskListPanel.svelte +++ /dev/null @@ -1,80 +0,0 @@ - - -
- {#if tasks.length === 0} -

No tasks yet.

- {:else} -

- {completedCount}/{activeTotal} completed{#if inProgressCount > 0}, {inProgressCount} in progress{/if}{#if cancelledCount > 0}, {cancelledCount} cancelled{/if} -

-
    - {#each tasks as task (task.id)} -
  • - - - {task.content} - -
  • - {/each} -
- {/if} -
diff --git a/packages/frontend/src/lib/components/ToolCallDisplay.svelte b/packages/frontend/src/lib/components/ToolCallDisplay.svelte deleted file mode 100644 index 1b4ebca..0000000 --- a/packages/frontend/src/lib/components/ToolCallDisplay.svelte +++ /dev/null @@ -1,140 +0,0 @@ - - -
- -
{ if (e.key === 'Enter' || e.key === ' ') toggle(); }} - aria-expanded={isExpanded} - > - tool - {toolCall.name} - {#if summonAgentId !== null} - - {/if} - {#if toolCall.result !== undefined} - {#if toolCall.result.includes("[USER INTERRUPT]")} - interrupted - {:else if isShell && shellResult !== null} - - exit {shellResult.exitCode} - - {:else if toolCall.isError} - error - {:else} - done - {/if} - {:else} - pending - {/if} -
- -
-
-

Arguments

-
{JSON.stringify(toolCall.arguments, null, 2)}
-
- {#if isShell && toolCall.result !== undefined} - {#if shellResult !== null} -
-

stdout:

-
{shellResult.stdout || "(empty)"}
-
- {#if shellResult.stderr} -
-

stderr:

-
{shellResult.stderr}
-
- {/if} -
- exit code: - {shellResult.exitCode} -
- {:else} -
-

Result

-
{toolCall.result}
-
- {/if} - {:else if isShell && toolCall.shellOutput} - {#if toolCall.shellOutput.stdout} -
-

stdout

-
{toolCall.shellOutput.stdout}
-
- {/if} - {#if toolCall.shellOutput.stderr} -
-

stderr

-
{toolCall.shellOutput.stderr}
-
- {/if} - Running... - {:else if toolCall.result !== undefined} -
-

Result

-
{toolCall.result}
-
- {/if} -
-
diff --git a/packages/frontend/src/lib/components/ToolPermissions.svelte b/packages/frontend/src/lib/components/ToolPermissions.svelte deleted file mode 100644 index 4298724..0000000 --- a/packages/frontend/src/lib/components/ToolPermissions.svelte +++ /dev/null @@ -1,185 +0,0 @@ - - -
-
Tool Permissions
- {#if !externalMode} -

Changes are applied when you send your next message.

- {/if} - -
- {#each toolPermissions as perm (perm.id)} - - {/each} -
- - {#if !externalMode} - - -

Warning: changing tool access will reset the AI's prompt cache for active conversations, which may increase usage costs.

- - - {#if entries.length > 0} -
- -
- Log ({entries.length}) -
-
- {#each entries as entry (entry.id)} -
- - {entry.action} - - {entry.permission} - {entry.timestamp} -
-

{entry.description}

- {/each} -
-
- {/if} - {/if} -
-- cgit v1.2.3