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.34.0
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkaos",
3
- "version": "3.34.0",
3
+ "version": "3.35.0",
4
4
  "description": "The Operating System for AI Agent Teams",
5
5
  "type": "module",
6
6
  "bin": {
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "arkaos-core"
3
- version = "3.34.0"
3
+ version = "3.35.0"
4
4
  description = "Core engine for ArkaOS — The Operating System for AI Agent Teams"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -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")