arkaos 3.41.0 → 3.43.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 +1 -1
- package/dashboard/app/composables/useThemeColor.ts +53 -0
- package/dashboard/app/layouts/default.vue +4 -0
- package/dashboard/app/pages/settings.vue +36 -0
- package/dashboard/app/pages/workflows.vue +13 -6
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/scripts/__pycache__/dashboard-api.cpython-313.pyc +0 -0
- package/scripts/dashboard-api.py +13 -4
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.43.0
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// PR92d v3.42.0 — runtime theme color picker.
|
|
2
|
+
//
|
|
3
|
+
// Stores the operator's preferred primary color in localStorage and
|
|
4
|
+
// applies it to the live Nuxt UI app config so every component picks
|
|
5
|
+
// up the new hue on next render.
|
|
6
|
+
|
|
7
|
+
import { createSharedComposable } from '@vueuse/core'
|
|
8
|
+
|
|
9
|
+
const STORAGE_KEY = 'arkaos_theme_color'
|
|
10
|
+
|
|
11
|
+
export const THEME_COLOR_OPTIONS = [
|
|
12
|
+
{ label: 'Emerald (default)', value: 'emerald' },
|
|
13
|
+
{ label: 'Blue', value: 'blue' },
|
|
14
|
+
{ label: 'Indigo', value: 'indigo' },
|
|
15
|
+
{ label: 'Violet', value: 'violet' },
|
|
16
|
+
{ label: 'Rose', value: 'rose' },
|
|
17
|
+
{ label: 'Amber', value: 'amber' },
|
|
18
|
+
{ label: 'Teal', value: 'teal' },
|
|
19
|
+
{ label: 'Cyan', value: 'cyan' },
|
|
20
|
+
] as const
|
|
21
|
+
|
|
22
|
+
export type ThemeColor = (typeof THEME_COLOR_OPTIONS)[number]['value']
|
|
23
|
+
|
|
24
|
+
const _useThemeColor = () => {
|
|
25
|
+
const appConfig = useAppConfig()
|
|
26
|
+
const current = ref<ThemeColor>('emerald')
|
|
27
|
+
|
|
28
|
+
function apply(color: ThemeColor) {
|
|
29
|
+
current.value = color
|
|
30
|
+
if (appConfig.ui?.colors) {
|
|
31
|
+
;(appConfig.ui.colors as any).primary = color
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function setAndPersist(color: ThemeColor) {
|
|
36
|
+
apply(color)
|
|
37
|
+
if (typeof window !== 'undefined') {
|
|
38
|
+
window.localStorage.setItem(STORAGE_KEY, color)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function loadFromStorage() {
|
|
43
|
+
if (typeof window === 'undefined') return
|
|
44
|
+
const saved = window.localStorage.getItem(STORAGE_KEY) as ThemeColor | null
|
|
45
|
+
if (saved && THEME_COLOR_OPTIONS.some((o) => o.value === saved)) {
|
|
46
|
+
apply(saved)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return { current, apply, setAndPersist, loadFromStorage }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const useThemeColor = createSharedComposable(_useThemeColor)
|
|
@@ -4,6 +4,10 @@ import type { NavigationMenuItem } from '@nuxt/ui'
|
|
|
4
4
|
// PR85c v3.13.0 — registers keyboard shortcuts globally.
|
|
5
5
|
useDashboard()
|
|
6
6
|
|
|
7
|
+
// PR92d v3.42.0 — apply the operator's chosen primary color on boot.
|
|
8
|
+
const theme = useThemeColor()
|
|
9
|
+
onMounted(() => theme.loadFromStorage())
|
|
10
|
+
|
|
7
11
|
const open = ref(false)
|
|
8
12
|
|
|
9
13
|
const links = [[{
|
|
@@ -234,6 +234,11 @@ const themeOptions = [
|
|
|
234
234
|
{ label: 'Dark', value: 'dark' },
|
|
235
235
|
]
|
|
236
236
|
|
|
237
|
+
// PR92d v3.42.0 — primary color picker.
|
|
238
|
+
import { THEME_COLOR_OPTIONS, useThemeColor } from '~/composables/useThemeColor'
|
|
239
|
+
const themeColor = useThemeColor()
|
|
240
|
+
const themeColorOptions = THEME_COLOR_OPTIONS
|
|
241
|
+
|
|
237
242
|
function transportColor(transport: string): 'primary' | 'warning' | 'success' | 'neutral' {
|
|
238
243
|
if (transport === 'stdio') return 'primary'
|
|
239
244
|
if (transport === 'http' || transport === 'sse') return 'success'
|
|
@@ -750,6 +755,37 @@ const activeSection = ref<SectionId>('profile')
|
|
|
750
755
|
Currently rendering as
|
|
751
756
|
<UBadge :label="colorMode.value" variant="subtle" size="xs" />
|
|
752
757
|
</p>
|
|
758
|
+
|
|
759
|
+
<!-- PR92d v3.42.0 — primary color picker -->
|
|
760
|
+
<UFormField label="Primary color" help="Tints buttons, badges, links across the dashboard.">
|
|
761
|
+
<div class="flex flex-wrap gap-2">
|
|
762
|
+
<button
|
|
763
|
+
v-for="opt in themeColorOptions"
|
|
764
|
+
:key="opt.value"
|
|
765
|
+
type="button"
|
|
766
|
+
class="rounded-lg border p-2 transition-colors text-xs flex items-center gap-2"
|
|
767
|
+
:class="themeColor.current.value === opt.value
|
|
768
|
+
? 'border-primary bg-primary/10 font-semibold'
|
|
769
|
+
: 'border-default hover:border-primary/40'"
|
|
770
|
+
@click="themeColor.setAndPersist(opt.value)"
|
|
771
|
+
>
|
|
772
|
+
<span
|
|
773
|
+
class="size-4 rounded-full"
|
|
774
|
+
:class="{
|
|
775
|
+
'bg-emerald-500': opt.value === 'emerald',
|
|
776
|
+
'bg-blue-500': opt.value === 'blue',
|
|
777
|
+
'bg-indigo-500': opt.value === 'indigo',
|
|
778
|
+
'bg-violet-500': opt.value === 'violet',
|
|
779
|
+
'bg-rose-500': opt.value === 'rose',
|
|
780
|
+
'bg-amber-500': opt.value === 'amber',
|
|
781
|
+
'bg-teal-500': opt.value === 'teal',
|
|
782
|
+
'bg-cyan-500': opt.value === 'cyan',
|
|
783
|
+
}"
|
|
784
|
+
/>
|
|
785
|
+
{{ opt.label }}
|
|
786
|
+
</button>
|
|
787
|
+
</div>
|
|
788
|
+
</UFormField>
|
|
753
789
|
</div>
|
|
754
790
|
</UCard>
|
|
755
791
|
</section>
|
|
@@ -13,6 +13,7 @@ interface WorkflowPhase {
|
|
|
13
13
|
description: string
|
|
14
14
|
gate_type: string
|
|
15
15
|
agent_count: number
|
|
16
|
+
agent_ids?: string[]
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
interface Workflow {
|
|
@@ -268,16 +269,22 @@ const columns: TableColumn<Workflow>[] = [
|
|
|
268
269
|
variant="subtle"
|
|
269
270
|
size="xs"
|
|
270
271
|
/>
|
|
271
|
-
<UBadge
|
|
272
|
-
v-if="ph.agent_count > 0"
|
|
273
|
-
:label="`${ph.agent_count} agent${ph.agent_count === 1 ? '' : 's'}`"
|
|
274
|
-
variant="outline"
|
|
275
|
-
size="xs"
|
|
276
|
-
/>
|
|
277
272
|
</div>
|
|
278
273
|
<p v-if="ph.description" class="text-xs text-muted mt-1">
|
|
279
274
|
{{ ph.description }}
|
|
280
275
|
</p>
|
|
276
|
+
<!-- PR93a v3.43.0 — clickable agent badges -->
|
|
277
|
+
<div v-if="ph.agent_ids && ph.agent_ids.length > 0" class="flex flex-wrap gap-1 mt-2">
|
|
278
|
+
<NuxtLink
|
|
279
|
+
v-for="aid in ph.agent_ids"
|
|
280
|
+
:key="aid"
|
|
281
|
+
:to="`/agents/${aid}`"
|
|
282
|
+
class="inline-flex items-center gap-1 rounded-md border border-default px-1.5 py-0.5 text-[10px] font-mono hover:border-primary/40 hover:text-primary transition-colors"
|
|
283
|
+
>
|
|
284
|
+
<UIcon name="i-lucide-user" class="size-2.5" />
|
|
285
|
+
{{ aid }}
|
|
286
|
+
</NuxtLink>
|
|
287
|
+
</div>
|
|
281
288
|
</div>
|
|
282
289
|
</li>
|
|
283
290
|
</ol>
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
Binary file
|
package/scripts/dashboard-api.py
CHANGED
|
@@ -1918,21 +1918,30 @@ def workflows_list():
|
|
|
1918
1918
|
|
|
1919
1919
|
|
|
1920
1920
|
def _summarise_phases(phases: list) -> list[dict]:
|
|
1921
|
-
"""PR91c v3.37.0 — distil each phase down to what the flow stepper needs.
|
|
1921
|
+
"""PR91c v3.37.0 — distil each phase down to what the flow stepper needs.
|
|
1922
|
+
|
|
1923
|
+
PR93a v3.43.0 — also surfaces the explicit ``agent_ids`` so the UI
|
|
1924
|
+
can render them as clickable badges.
|
|
1925
|
+
"""
|
|
1922
1926
|
out: list[dict] = []
|
|
1923
1927
|
for p in phases:
|
|
1924
1928
|
if not isinstance(p, dict):
|
|
1925
1929
|
continue
|
|
1926
1930
|
gate = p.get("gate") if isinstance(p.get("gate"), dict) else {}
|
|
1927
1931
|
agents = p.get("agents") if isinstance(p.get("agents"), list) else []
|
|
1932
|
+
agent_ids: list[str] = []
|
|
1933
|
+
for a in agents:
|
|
1934
|
+
if isinstance(a, dict):
|
|
1935
|
+
aid = a.get("agent_id")
|
|
1936
|
+
if aid:
|
|
1937
|
+
agent_ids.append(str(aid))
|
|
1928
1938
|
out.append({
|
|
1929
1939
|
"id": str(p.get("id") or ""),
|
|
1930
1940
|
"name": str(p.get("name") or ""),
|
|
1931
1941
|
"description": str(p.get("description") or ""),
|
|
1932
1942
|
"gate_type": str(gate.get("type") or ""),
|
|
1933
|
-
"agent_count":
|
|
1934
|
-
|
|
1935
|
-
),
|
|
1943
|
+
"agent_count": len(agent_ids),
|
|
1944
|
+
"agent_ids": agent_ids,
|
|
1936
1945
|
})
|
|
1937
1946
|
return out
|
|
1938
1947
|
|