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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 23 additions & 9 deletions admin/slices/agent/peer/components/peer/Picker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,18 @@ const urlPreviewAdvertisesNothing = computed(
v-if="previewAdvertisesNothing"
class="rounded-md border border-amber-500/30 bg-amber-500/10 px-2.5 py-2 text-xs text-amber-700 dark:text-amber-500"
>
You can connect «{{ candidate.name }}», but with an empty
card the delegating agent will only ask it when the user
names it outright — topic matching has nothing to grip.
Better first: give it a description (Edit on its page), a
template with skills, or
<template v-if="preview?.description">
«{{ candidate.name }}» has no skills on its card —
matching will lean on its description alone. Sharper
first: a template with skills, or
</template>
<template v-else>
You can connect «{{ candidate.name }}», but with an
empty card the delegating agent will only ask it when
the user names it outright — topic matching has nothing
to grip. Better first: give it a description (Edit on
its page), a template with skills, or
</template>
<NuxtLink
:to="`/agents/${candidate.id}?tab=knowledge`"
class="font-medium underline"
Expand Down Expand Up @@ -346,10 +353,17 @@ const urlPreviewAdvertisesNothing = computed(
v-if="urlPreviewAdvertisesNothing"
class="rounded-md border border-amber-500/30 bg-amber-500/10 px-2.5 py-2 text-xs text-amber-700 dark:text-amber-500"
>
This card advertises nothing, so the delegating agent will
only ask «{{ urlPreview.name }}» when the user names it
outright. Ask its owner to publish a description and skills,
then Re-read the card here.
<template v-if="urlPreview.description">
«{{ urlPreview.name }}» publishes no skills — matching will
lean on its description alone. Ask its owner to publish
skills, then Re-read the card here.
</template>
<template v-else>
This card advertises nothing, so the delegating agent will
only ask «{{ urlPreview.name }}» when the user names it
outright. Ask its owner to publish a description and
skills, then Re-read the card here.
</template>
</div>
<Button
size="sm"
Expand Down
7 changes: 6 additions & 1 deletion admin/slices/agent/peer/components/peer/Row.vue
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,12 @@ const failReason = computed<string | null>(() => {
v-else
class="text-xs text-amber-700 dark:text-amber-500"
>
Advertises nothing — reachable by name only, never by topic.
<template v-if="peer.card?.description">
No skills advertised — matching leans on its description alone.
</template>
<template v-else>
Advertises nothing — reachable by name only, never by topic.
</template>
<template v-if="peer.peerAgentId">
Give it a description or
<NuxtLink
Expand Down
85 changes: 74 additions & 11 deletions admin/slices/agent/peer/components/peer/Tab.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,21 @@ const address = computed(
const nothingAdvertised = computed(
() => Boolean(ownCard.value) && !ownCard.value!.skills.length,
);
// Per-source status for the hint: a card with a description but no skills is
// NOT "nothing" — matching already runs on that text (CLEAN-95 prod run
// proved it); the hint must say what is set and what is still missing.
const cardHasDescription = computed(() =>
Boolean(ownCard.value?.description?.trim()),
);
const templateSkillCount = computed(
() =>
ownCard.value?.skills.filter((s) => s.tags.includes('skill')).length ?? 0,
);
const knowledgeSkillCount = computed(
() =>
ownCard.value?.skills.filter((s) => s.tags.includes('knowledge')).length ??
0,
);
const needAttention = computed(
() =>
peers.value.filter((p) => !p.peerExists || p.peerStatus !== 'running')
Expand Down Expand Up @@ -215,22 +230,70 @@ function goToKnowledge() {
class="max-w-xl space-y-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2.5"
>
<p class="text-sm font-medium text-amber-700 dark:text-amber-500">
This card advertises nothing yet
{{
cardHasDescription
? 'This card has no skills yet'
: 'This card advertises nothing yet'
}}
</p>
<p class="text-sm text-amber-700/90 dark:text-amber-500/90">
A delegating agent matches questions against this exact text.
Empty card = it will only ask this agent when the user names it
outright — never by topic. The card fills itself from:
<template v-if="cardHasDescription">
Right now that is the description alone — skills sharpen the
match and fill the CAN-DO section other agents read.
</template>
<template v-else>
An empty card means it will only be asked when the user names
this agent outright — never by topic.
</template>
Where the card stands:
</p>
<ul class="list-disc space-y-0.5 pl-5 text-sm text-amber-700/90 dark:text-amber-500/90">
<li>
<b>Description</b> — the agent's description field
(<b>Edit</b>, top right of this page)
<!-- ✓/○ per source, so what is already set (and visible right
above) is never listed as if it were missing. -->
<ul class="space-y-0.5 text-sm">
<li
:class="
cardHasDescription
? 'text-emerald-700 dark:text-emerald-500'
: 'text-amber-700/90 dark:text-amber-500/90'
"
>
{{ cardHasDescription ? '✓' : '○' }} <b>Description</b> —
<template v-if="cardHasDescription">
set (the text above; edit via <b>Edit</b>, top right)
</template>
<template v-else>
missing — the agent's description field (<b>Edit</b>, top
right of this page)
</template>
</li>
<li><b>Skills</b> — the skills of its template</li>
<li>
<b>Knowledge</b> — every bound knowledge base becomes a
"can answer about …" skill
<li
:class="
templateSkillCount
? 'text-emerald-700 dark:text-emerald-500'
: 'text-amber-700/90 dark:text-amber-500/90'
"
>
{{ templateSkillCount ? '✓' : '○' }} <b>Skills</b> —
{{
templateSkillCount
? `${templateSkillCount} from its template`
: 'none: its template has no skills'
}}
</li>
<li
:class="
knowledgeSkillCount
? 'text-emerald-700 dark:text-emerald-500'
: 'text-amber-700/90 dark:text-amber-500/90'
"
>
{{ knowledgeSkillCount ? '✓' : '○' }} <b>Knowledge</b> —
{{
knowledgeSkillCount
? `${knowledgeSkillCount} base${knowledgeSkillCount === 1 ? '' : 's'} advertised`
: 'none bound — every base becomes a "can answer about …" skill'
}}
</li>
</ul>
<Button
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ranch",
"version": "0.3.52",
"version": "0.3.53",
"private": true,
"packageManager": "bun@1.2.12",
"workspaces": [
Expand Down
Loading