arkaos 3.34.0 → 3.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.35.0
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// PR91a v3.35.0 — "What's missing?" home page card.
|
|
3
|
+
//
|
|
4
|
+
// Lists empty departments (high severity) and depts missing a Tier 2
|
|
5
|
+
// specialist (medium). Each suggestion is a link to /agents/new.
|
|
6
|
+
|
|
7
|
+
interface Suggestion {
|
|
8
|
+
department: string
|
|
9
|
+
reason: string
|
|
10
|
+
recommended_tier: 1 | 2
|
|
11
|
+
severity: 'high' | 'medium'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const { fetchApi } = useApi()
|
|
15
|
+
const { data, status } = fetchApi<{ suggestions: Suggestion[], total_gaps: number }>(
|
|
16
|
+
'/api/agents/suggestions?limit=6',
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const suggestions = computed<Suggestion[]>(() => data.value?.suggestions ?? [])
|
|
20
|
+
|
|
21
|
+
function severityColor(s: string): 'error' | 'warning' | 'neutral' {
|
|
22
|
+
return s === 'high' ? 'error' : s === 'medium' ? 'warning' : 'neutral'
|
|
23
|
+
}
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<UCard v-if="status !== 'pending' && suggestions.length > 0">
|
|
28
|
+
<template #header>
|
|
29
|
+
<div class="flex items-center justify-between">
|
|
30
|
+
<div>
|
|
31
|
+
<h3 class="text-lg font-semibold">What's missing?</h3>
|
|
32
|
+
<p class="text-xs text-muted mt-0.5">
|
|
33
|
+
{{ data?.total_gaps }} gap{{ data?.total_gaps === 1 ? '' : 's' }} across departments. Showing top {{ suggestions.length }}.
|
|
34
|
+
</p>
|
|
35
|
+
</div>
|
|
36
|
+
<UIcon name="i-lucide-sparkles" class="size-5 text-primary" />
|
|
37
|
+
</div>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-2">
|
|
41
|
+
<NuxtLink
|
|
42
|
+
v-for="s in suggestions"
|
|
43
|
+
:key="`${s.department}:${s.recommended_tier}`"
|
|
44
|
+
to="/agents/new"
|
|
45
|
+
class="flex items-center gap-3 rounded-lg border border-default p-3 hover:border-primary/40 transition-colors"
|
|
46
|
+
>
|
|
47
|
+
<UBadge
|
|
48
|
+
:label="s.severity"
|
|
49
|
+
:color="severityColor(s.severity)"
|
|
50
|
+
variant="subtle"
|
|
51
|
+
size="xs"
|
|
52
|
+
/>
|
|
53
|
+
<div class="flex-1 min-w-0">
|
|
54
|
+
<p class="text-sm font-semibold capitalize truncate">{{ s.department }}</p>
|
|
55
|
+
<p class="text-xs text-muted truncate">{{ s.reason }}</p>
|
|
56
|
+
</div>
|
|
57
|
+
<span class="text-xs font-mono text-muted shrink-0">T{{ s.recommended_tier }}</span>
|
|
58
|
+
<UIcon name="i-lucide-arrow-right" class="size-4 text-muted shrink-0" />
|
|
59
|
+
</NuxtLink>
|
|
60
|
+
</div>
|
|
61
|
+
</UCard>
|
|
62
|
+
</template>
|
|
@@ -204,6 +204,9 @@ function copyCommand(cmd: string) {
|
|
|
204
204
|
</div>
|
|
205
205
|
</UCard>
|
|
206
206
|
|
|
207
|
+
<!-- PR91a v3.35.0 — Agent gap suggestions -->
|
|
208
|
+
<AgentSuggestionsCard class="mb-6" />
|
|
209
|
+
|
|
207
210
|
<!-- PR84d v3.10.0 — Top departments + Recent personas row -->
|
|
208
211
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
|
|
209
212
|
<div>
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
Binary file
|
package/scripts/dashboard-api.py
CHANGED
|
@@ -1567,6 +1567,63 @@ def agent_export_to_vault(agent_id: str):
|
|
|
1567
1567
|
return {"exported": True, "path": str(res.path), "vault_path": str(res.vault_path)}
|
|
1568
1568
|
|
|
1569
1569
|
|
|
1570
|
+
# --- Agent gap suggestions (PR91a v3.35.0) ---
|
|
1571
|
+
|
|
1572
|
+
_KNOWN_DEPARTMENTS = (
|
|
1573
|
+
"dev", "marketing", "brand", "finance", "strategy", "ecom", "kb",
|
|
1574
|
+
"ops", "pm", "saas", "landing", "content", "community", "sales",
|
|
1575
|
+
"leadership", "org",
|
|
1576
|
+
)
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
@app.get("/api/agents/suggestions")
|
|
1580
|
+
def agents_suggestions(limit: int = 6):
|
|
1581
|
+
"""PR91a v3.35.0 — recommend agents the operator should consider creating.
|
|
1582
|
+
|
|
1583
|
+
Heuristics:
|
|
1584
|
+
1. Departments with zero agents at all (severity: high).
|
|
1585
|
+
2. Departments missing a Tier 2 specialist (severity: medium).
|
|
1586
|
+
|
|
1587
|
+
Each suggestion includes ``reason`` and ``recommended_tier``. Used
|
|
1588
|
+
by the home page "What's missing?" card.
|
|
1589
|
+
"""
|
|
1590
|
+
agents = _load_agents()
|
|
1591
|
+
by_dept: dict[str, dict] = {}
|
|
1592
|
+
for a in agents:
|
|
1593
|
+
dept = a.get("department") or ""
|
|
1594
|
+
if not dept:
|
|
1595
|
+
continue
|
|
1596
|
+
row = by_dept.setdefault(dept, {"count": 0, "tiers": set()})
|
|
1597
|
+
row["count"] += 1
|
|
1598
|
+
try:
|
|
1599
|
+
row["tiers"].add(int(a.get("tier") or 99))
|
|
1600
|
+
except (TypeError, ValueError):
|
|
1601
|
+
pass
|
|
1602
|
+
|
|
1603
|
+
suggestions: list[dict] = []
|
|
1604
|
+
for dept in _KNOWN_DEPARTMENTS:
|
|
1605
|
+
info = by_dept.get(dept)
|
|
1606
|
+
if info is None or info["count"] == 0:
|
|
1607
|
+
suggestions.append({
|
|
1608
|
+
"department": dept,
|
|
1609
|
+
"reason": "no agents — department is empty",
|
|
1610
|
+
"recommended_tier": 1,
|
|
1611
|
+
"severity": "high",
|
|
1612
|
+
})
|
|
1613
|
+
continue
|
|
1614
|
+
if 2 not in info["tiers"]:
|
|
1615
|
+
suggestions.append({
|
|
1616
|
+
"department": dept,
|
|
1617
|
+
"reason": "no Tier 2 specialist",
|
|
1618
|
+
"recommended_tier": 2,
|
|
1619
|
+
"severity": "medium",
|
|
1620
|
+
})
|
|
1621
|
+
return {
|
|
1622
|
+
"suggestions": suggestions[: max(0, int(limit))],
|
|
1623
|
+
"total_gaps": len(suggestions),
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
|
|
1570
1627
|
# --- Departments (PR89a v3.27.0) ---
|
|
1571
1628
|
|
|
1572
1629
|
@app.get("/api/departments")
|