Entry points
Where an assistant lives, and how a person starts one without spending a model call by accident.
The side panel
Stays live and stays visible. Nothing is dimmed, nothing is trapped.
Code
<GdAiPanel
scope="Reads this project's four layers and Terra's toolbox. It cannot see the map."
@close="open = false"
>
<GdAiThread :revision="rev"> … </GdAiThread>
<template #composer>
<GdAiComposer v-model="draft" @send="ask" />
</template>
</GdAiPanel>Inline and empty states
Ask about this project
It reads your layers and Terra's toolbox. It cannot see the map, and it will say so rather than guess.
Code
<GdAiThread>
<template #empty>
<GdEmptyState title="Ask about this project" …>
<GdButton variant="ai" size="sm" v-for="q in SUGGESTED">…</GdButton>
</GdEmptyState>
</template>
</GdAiThread>API
GdAiPanel
Props
titlestring"GRIDD AI"The panel's name, in the header and as its accessible name.
scopestring—One line saying what this assistant can read. The honest replacement for a disclaimer — see Why this way.
generatingboolean—A model is producing an answer somewhere in the thread.
Slots
defaultThe body — normally a GdAiThread, which is also the container the contents adapt to.
composerPinned below the body. Separate from the default slot so the thread scrolls and the composer does not.
toolsHeader controls left of the close button — a history picker, a model badge, a clear action.
The panel does not own where it sits, how wide it is, or whether it is open. One that positioned itself would fight GdSidePanel on the map and the rail in Terra, which are different frames with different rules. It is a column that fills what it is given.
Behavior & Anatomy
Scope beats disclaimer
"May produce inaccurate information" tells a planner nothing they can act on. "Reads this project's layers and Terra's toolbox — it cannot see the map" tells them exactly which questions are worth asking and which are not, which is the same information stated usefully. So the panel takes a scope line, in the header, permanently — not a dismissible banner that is gone by the second session.
A variant, not a GdAiButton
This system has one button and a list of things it can look like, and adding to that list is cheaper than adding to the component count: everything a button already is — the element, the size ladder, the focus ring, the loading swap, the icon slot — would have to be rebuilt by a parallel component to change a colour and add a glyph.