Files
amcs/ui/src/components/auth/LoginInfoPanel.svelte
T
warkanum c179e014ad
CI / build-and-test (push) Failing after 1m52s
feat(db): add project personas and skills tables
* Introduce project_personas table with foreign keys to projects and agent_personas
* Add project_skills table with foreign key to projects and agent_skills
* Include override boolean field in agent_persona_skills and project_skills
* Update schema and migration files to reflect new tables and fields
* Enhance CORS handling to reflect request origin
2026-07-04 23:45:51 +02:00

233 lines
8.2 KiB
Svelte

<script lang="ts">
import type { PublicStatusResponse } from "../../types";
type IntelligenceCard = {
id: string;
title: string;
accentClass: string;
summary: string;
detail: string;
tools: string[];
};
const {
isOAuthCallback,
data,
loading,
error,
}: {
isOAuthCallback: boolean;
data: PublicStatusResponse | null;
loading: boolean;
error: string;
} = $props();
const intelligenceCards: IntelligenceCard[] = [
{
id: "projects",
title: "Projects",
accentClass: "text-indigo-200",
summary:
"Named containers that scope memory and operations so retrieval stays focused on the right workstream.",
detail:
"Project context can be resolved explicitly or from active session scope depending on client behavior.",
tools: ["list_projects", "create_project", "get_project_context"],
},
{
id: "thoughts",
title: "Thoughts",
accentClass: "text-violet-200",
summary:
"Core memory records with metadata and links that power search, recall, summaries, and relationship traversal.",
detail:
"Thought capture can include metadata enrichment and link-based navigation for richer retrieval.",
tools: ["capture_thought", "search_thoughts", "related_thoughts"],
},
{
id: "skills",
title: "Skills",
accentClass: "text-cyan-200",
summary:
"Reusable agent instructions and capabilities that can be linked to a project and loaded with it.",
detail:
"Use project-linked skills to keep behavior consistent across sessions and assistants.",
tools: ["list_project_skills", "add_skill", "add_project_skill"],
},
{
id: "guardrails",
title: "Guardrails",
accentClass: "text-amber-200",
summary:
"Safety and policy constraints with severity levels that can be enforced globally or per project.",
detail:
"Guardrails provide stable operational boundaries for memory and tool usage behavior.",
tools: [
"list_project_guardrails",
"add_guardrail",
"add_project_guardrail",
],
},
{
id: "learnings",
title: "Learnings",
accentClass: "text-emerald-200",
summary:
"Curated records for durable lessons and decisions, separate from raw thoughts for cleaner review.",
detail:
"Structured fields such as status, priority, and confidence support operational follow-through.",
tools: ["add_learning", "list_learnings", "get_learning"],
},
{
id: "vector-metadata-build",
title: "Vector + Metadata Build",
accentClass: "text-fuchsia-200",
summary:
"Backfill and repair flows for embeddings and metadata so retrieval quality stays healthy over time.",
detail:
"Use dry runs for safe audits, then run updates to regenerate missing vectors or retry failed metadata.",
tools: [
"backfill_embeddings",
"reparse_thought_metadata",
"retry_failed_metadata",
],
},
];
let activeCard = $state("projects");
function setActiveCard(id: string) {
activeCard = id;
}
</script>
<div
class="rounded-3xl border border-cyan-400/20 bg-slate-900/80 p-8 shadow-2xl shadow-slate-950/40"
>
<div
class="inline-flex items-center gap-2 rounded-full border border-cyan-400/20 bg-cyan-400/10 px-3 py-1 text-sm font-medium text-cyan-200"
>
<span class="h-2 w-2 rounded-full bg-emerald-400"></span>
AMCS (Avalon Memory Control Service)
</div>
<h1 class="mt-6 text-4xl font-semibold tracking-tight text-white">
{#if isOAuthCallback}
Completing login...
{:else}
Avalon Memory Control Service
{/if}
</h1>
<p class="mt-3 max-w-2xl text-base leading-7 text-slate-300">
AMCS is a Go MCP server for capturing project thoughts, semantic retrieval,
summaries, and linked memory workflows with Postgres + pgvector.
</p>
<p class="mt-2 max-w-2xl text-sm leading-6 text-slate-400">
It stores durable memory for assistants, supports project scoping, and
exposes tools over MCP for capture, search, context recall, and structured
operations.
</p>
<div class="mt-8 grid gap-4 sm:grid-cols-3">
<div class="rounded-2xl border border-white/10 bg-white/5 p-5">
<p class="text-sm uppercase tracking-[0.2em] text-slate-400">
Server status
</p>
{#if loading}
<p class="mt-2 text-lg font-semibold text-white">Loading…</p>
{:else if error}
<p class="mt-2 text-sm font-medium text-rose-300">Unavailable</p>
<p class="mt-2 text-xs text-rose-200/80">{error}</p>
{:else if data}
<p class="mt-2 text-2xl font-semibold text-white">
{data.connected_count}
</p>
<p class="mt-2 text-sm text-slate-400">
connected in {data.connected_window}
</p>
{#if data.entries.length > 0}
<p class="mt-2 text-xs text-slate-400">
Clients:
{#each data.entries.slice(0, 3) as client, idx}
<code class="text-slate-200">{client.key_id}</code>{idx <
Math.min(data.entries.length, 3) - 1
? ", "
: ""}
{/each}
{data.entries.length > 3 ? " …" : ""}
</p>
{/if}
<a
href="/status"
class="mt-3 inline-flex items-center rounded-lg border border-emerald-300/30 bg-emerald-400/10 px-3 py-1.5 text-xs font-semibold uppercase tracking-[0.12em] text-emerald-100 transition hover:border-emerald-300/50 hover:bg-emerald-400/20"
>
Status Endpoint
</a>
{:else}
<p class="mt-2 text-sm text-slate-400">No status snapshot yet.</p>
{/if}
</div>
<div class="rounded-2xl border border-white/10 bg-white/5 p-5">
<p class="text-sm uppercase tracking-[0.2em] text-slate-400">
Memory stack
</p>
<p class="mt-2 text-2xl font-semibold text-white">Postgres + pgvector</p>
<p class="mt-2 text-sm text-slate-400">
Semantic search with full-text fallback when vectors are missing.
</p>
</div>
<div class="rounded-2xl border border-white/10 bg-white/5 p-5">
<p class="text-sm uppercase tracking-[0.2em] text-slate-400">
Operator docs
</p>
<a
href="/llm"
class="mt-2 inline-flex items-center rounded-lg border border-cyan-300/30 bg-cyan-400/10 px-3 py-2 text-sm font-semibold text-cyan-100 transition hover:border-cyan-300/50 hover:bg-cyan-400/20"
>
Open LLM Instructions
</a>
<p class="mt-2 text-sm text-slate-400">
Tool behavior, workflows, and MCP guidance for assistants.
</p>
</div>
</div>
<div class="mt-6 rounded-2xl border border-white/10 bg-slate-950/35 p-5">
<h2 class="text-lg font-semibold text-white">Project intelligence model</h2>
<p class="mt-2 text-sm text-slate-400">
AMCS separates reusable behavior, safety constraints, and curated
knowledge so assistants can be guided consistently across sessions.
</p>
<div class="mt-4 grid gap-4 md:grid-cols-2 xl:grid-cols-3">
{#each intelligenceCards as card}
<button
type="button"
class={`w-full rounded-xl border p-4 text-left transition ${
activeCard === card.id
? "border-cyan-300/40 bg-cyan-400/[0.08] shadow-lg shadow-cyan-950/30"
: "border-white/10 bg-white/[0.03] hover:border-white/20 hover:bg-white/[0.05]"
}`}
aria-pressed={activeCard === card.id}
onclick={() => setActiveCard(card.id)}
>
<p class={`text-xs uppercase tracking-[0.16em] ${card.accentClass}`}>
{card.title}
</p>
<p class="mt-2 text-sm text-slate-300">{card.summary}</p>
{#if activeCard === card.id}
<p class="mt-2 text-xs text-slate-300/90">{card.detail}</p>
{/if}
<p class="mt-3 text-xs text-slate-400">
Tools:
{#each card.tools as tool, idx}
<code class="text-slate-200">{tool}</code>{idx <
card.tools.length - 1
? ", "
: ""}
{/each}
</p>
</button>
{/each}
</div>
</div>
</div>