arkaos 3.63.0 → 3.65.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.63.0
1
+ 3.65.0
@@ -0,0 +1,78 @@
1
+ <script setup lang="ts">
2
+ // PR98b v3.64.0 — quick list of starred agents/personas in the sidebar.
3
+ //
4
+ // Shows up to 4 agents + 4 personas. Each row links to its detail.
5
+ // Hides itself when the operator has zero favourites.
6
+
7
+ const favs = useFavorites()
8
+ const { fetchApi } = useApi()
9
+
10
+ await favs.load()
11
+ const { data: agentsData } = fetchApi<{ agents: Array<{ id: string, name: string }> }>(
12
+ '/api/agents',
13
+ )
14
+ const { data: personasData } = fetchApi<{ personas: Array<{ id: string, name: string }> }>(
15
+ '/api/personas',
16
+ )
17
+
18
+ interface FavRow { id: string, name: string }
19
+
20
+ const starredAgents = computed<FavRow[]>(() => {
21
+ const all = agentsData.value?.agents ?? []
22
+ return favs.state.value.agents
23
+ .map((id) => all.find((a) => a.id === id))
24
+ .filter((a): a is FavRow => Boolean(a))
25
+ .slice(0, 4)
26
+ })
27
+
28
+ const starredPersonas = computed<FavRow[]>(() => {
29
+ const all = personasData.value?.personas ?? []
30
+ return favs.state.value.personas
31
+ .map((id) => all.find((p) => p.id === id))
32
+ .filter((p): p is FavRow => Boolean(p))
33
+ .slice(0, 4)
34
+ })
35
+
36
+ const hasAny = computed(
37
+ () => starredAgents.value.length > 0 || starredPersonas.value.length > 0,
38
+ )
39
+ </script>
40
+
41
+ <template>
42
+ <div
43
+ v-if="hasAny"
44
+ class="rounded-lg border border-default bg-elevated/20 p-2 mx-2 mb-2 text-xs"
45
+ aria-label="Starred agents and personas"
46
+ >
47
+ <div class="flex items-center gap-1.5 mb-1.5">
48
+ <UIcon name="i-lucide-star" class="size-3 text-amber-500" />
49
+ <span class="font-semibold uppercase tracking-wide text-muted text-[10px]">
50
+ Favorites
51
+ </span>
52
+ </div>
53
+
54
+ <div v-if="starredAgents.length > 0" class="space-y-0.5 mb-1.5">
55
+ <NuxtLink
56
+ v-for="a in starredAgents"
57
+ :key="`a-${a.id}`"
58
+ :to="`/agents/${a.id}`"
59
+ class="flex items-center gap-1.5 rounded px-1.5 py-1 hover:bg-elevated/40 transition-colors"
60
+ >
61
+ <UIcon name="i-lucide-user" class="size-3 text-primary shrink-0" />
62
+ <span class="truncate">{{ a.name }}</span>
63
+ </NuxtLink>
64
+ </div>
65
+
66
+ <div v-if="starredPersonas.length > 0" class="space-y-0.5">
67
+ <NuxtLink
68
+ v-for="p in starredPersonas"
69
+ :key="`p-${p.id}`"
70
+ :to="`/personas/${p.id}`"
71
+ class="flex items-center gap-1.5 rounded px-1.5 py-1 hover:bg-elevated/40 transition-colors"
72
+ >
73
+ <UIcon name="i-lucide-user-plus" class="size-3 text-emerald-500 shrink-0" />
74
+ <span class="truncate">{{ p.name }}</span>
75
+ </NuxtLink>
76
+ </div>
77
+ </div>
78
+ </template>
@@ -156,8 +156,11 @@ const links = [[{
156
156
  popover
157
157
  />
158
158
 
159
+ <!-- PR98b v3.64.0 — favorites quick list -->
160
+ <SidebarFavoritesWidget v-if="!collapsed" class="mt-auto" />
161
+
159
162
  <!-- PR87d v3.22.0 — quick stats widget above the bottom nav. -->
160
- <SidebarStatsWidget v-if="!collapsed" class="mt-auto" />
163
+ <SidebarStatsWidget v-if="!collapsed" />
161
164
 
162
165
  <UNavigationMenu
163
166
  :collapsed="collapsed"
@@ -103,6 +103,29 @@ function gateColor(gateType: string): 'primary' | 'warning' | 'error' | 'neutral
103
103
  return m[gateType] ?? 'neutral'
104
104
  }
105
105
 
106
+ // PR98c v3.65.0 — copy a workflow's command to the clipboard so the
107
+ // operator can paste it into their runtime (Claude Code / Codex / Gemini).
108
+ // We can't run workflows from the dashboard — they orchestrate through
109
+ // the runtime's skill system, not via subprocess.
110
+ async function copyCommand(cmd: string) {
111
+ if (!cmd || typeof navigator === 'undefined' || !navigator.clipboard) return
112
+ try {
113
+ await navigator.clipboard.writeText(cmd)
114
+ toast.add({
115
+ title: 'Command copied',
116
+ description: `${cmd} — paste into your runtime to run`,
117
+ color: 'success',
118
+ icon: 'i-lucide-clipboard-check',
119
+ })
120
+ } catch {
121
+ toast.add({
122
+ title: 'Clipboard failed',
123
+ description: 'Browser blocked clipboard access',
124
+ color: 'error',
125
+ })
126
+ }
127
+ }
128
+
106
129
  async function loadRuns(id: string) {
107
130
  runsLoading.value = true
108
131
  try {
@@ -259,13 +282,24 @@ const columns: TableColumn<Workflow>[] = [
259
282
  <p class="font-semibold truncate">{{ selected.name }}</p>
260
283
  <p class="text-xs text-muted font-mono truncate">{{ selected.file }}</p>
261
284
  </div>
262
- <UButton
263
- icon="i-lucide-x"
264
- variant="ghost"
265
- size="xs"
266
- aria-label="Close preview"
267
- @click="selected = null"
268
- />
285
+ <div class="flex items-center gap-1">
286
+ <UButton
287
+ v-if="selected.command"
288
+ label="Copy command"
289
+ icon="i-lucide-clipboard-copy"
290
+ variant="soft"
291
+ color="primary"
292
+ size="xs"
293
+ @click="copyCommand(selected.command)"
294
+ />
295
+ <UButton
296
+ icon="i-lucide-x"
297
+ variant="ghost"
298
+ size="xs"
299
+ aria-label="Close preview"
300
+ @click="selected = null"
301
+ />
302
+ </div>
269
303
  </div>
270
304
  <p v-if="selected.description" class="text-xs text-muted mt-2">
271
305
  {{ selected.description }}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkaos",
3
- "version": "3.63.0",
3
+ "version": "3.65.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.63.0"
3
+ version = "3.65.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"}