arkaos 4.13.1 → 4.13.2
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/bin/arka-doctor +15 -1
- package/core/governance/__pycache__/evidence_checks.cpython-313.pyc +0 -0
- package/core/governance/evidence_checks.py +85 -4
- package/core/workflow/__pycache__/design_authorization.cpython-313.pyc +0 -0
- package/core/workflow/__pycache__/frontend_gate.cpython-313.pyc +0 -0
- package/core/workflow/design_authorization.py +106 -0
- package/core/workflow/frontend_gate.py +54 -22
- package/dashboard/app/app.config.ts +2 -2
- package/dashboard/app/assets/css/main.css +285 -13
- package/dashboard/app/components/ArkaConstellation.vue +239 -0
- package/dashboard/app/components/ArkaCountUp.vue +35 -0
- package/dashboard/app/components/ArkaGlowCard.vue +25 -0
- package/dashboard/app/components/ArkaLiveFeed.vue +122 -0
- package/dashboard/app/components/ArkaNavGroupLabel.vue +11 -0
- package/dashboard/app/components/ArkaPageHero.vue +42 -0
- package/dashboard/app/components/ArkaSection.vue +20 -0
- package/dashboard/app/components/ArkaStarfield.vue +3 -0
- package/dashboard/app/components/ArkaStatCard.vue +38 -0
- package/dashboard/app/components/ArkaSystemPill.vue +54 -0
- package/dashboard/app/components/ArkaTrendChart.vue +68 -0
- package/dashboard/app/composables/useCountUp.ts +30 -0
- package/dashboard/app/composables/useDashboard.ts +2 -1
- package/dashboard/app/composables/useTaskStream.ts +39 -0
- package/dashboard/app/layouts/default.vue +11 -2
- package/dashboard/app/pages/design-lab.vue +257 -0
- package/dashboard/app/pages/index.vue +268 -213
- package/dashboard/nuxt.config.ts +21 -0
- package/dashboard/package.json +1 -0
- package/departments/content/skills/video-produce/SKILL.md +9 -1
- package/departments/content/skills/video-setup/SKILL.md +15 -4
- package/installer/doctor.js +13 -8
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/scripts/start-dashboard.sh +3 -1
|
@@ -27,9 +27,10 @@ const _useDashboard = () => {
|
|
|
27
27
|
'g-e': () => router.push('/health'),
|
|
28
28
|
'g-s': () => router.push('/settings'),
|
|
29
29
|
'g-r': () => router.push('/trash'),
|
|
30
|
-
n: () => contextualNew(),
|
|
30
|
+
'n': () => contextualNew(),
|
|
31
31
|
'?': () => { shortcutsHelpOpen.value = !shortcutsHelpOpen.value },
|
|
32
32
|
'/': () => { searchOpen.value = true },
|
|
33
|
+
'meta_k': () => { searchOpen.value = true }
|
|
33
34
|
})
|
|
34
35
|
|
|
35
36
|
return { shortcutsHelpOpen, searchOpen }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Self-contained /ws/tasks subscription (additive — tasks.vue and
|
|
2
|
+
// PersonaWizard keep their own connections). Emits normalized events;
|
|
3
|
+
// silently stays closed on failure so poll-based consumers degrade clean.
|
|
4
|
+
export interface TaskStreamEvent {
|
|
5
|
+
type: 'job_progress' | 'job_complete' | 'job_failed' | 'job_cancelled'
|
|
6
|
+
job_id: string
|
|
7
|
+
message?: string
|
|
8
|
+
progress?: number
|
|
9
|
+
error?: string
|
|
10
|
+
ts: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function useTaskStream(onEvent: (e: TaskStreamEvent) => void) {
|
|
14
|
+
const { apiBase } = useApi()
|
|
15
|
+
let ws: WebSocket | null = null
|
|
16
|
+
|
|
17
|
+
onMounted(() => {
|
|
18
|
+
try {
|
|
19
|
+
ws = new WebSocket(`${apiBase.replace(/^http/, 'ws')}/ws/tasks`)
|
|
20
|
+
ws.onmessage = (msg) => {
|
|
21
|
+
try {
|
|
22
|
+
const data = JSON.parse(msg.data)
|
|
23
|
+
if (typeof data?.type === 'string' && data.type.startsWith('job_')) {
|
|
24
|
+
onEvent({ ...data, ts: Date.now() })
|
|
25
|
+
}
|
|
26
|
+
} catch {
|
|
27
|
+
// non-JSON frame — ignore
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
ws = null
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
onUnmounted(() => {
|
|
36
|
+
ws?.close()
|
|
37
|
+
ws = null
|
|
38
|
+
})
|
|
39
|
+
}
|
|
@@ -150,9 +150,11 @@ const links = [[{
|
|
|
150
150
|
class="flex items-center w-full"
|
|
151
151
|
:class="collapsed ? 'justify-center' : 'justify-between gap-2'"
|
|
152
152
|
>
|
|
153
|
-
<div class="flex items-
|
|
153
|
+
<div class="flex items-baseline gap-2">
|
|
154
154
|
<span class="text-xl font-bold text-primary">A</span>
|
|
155
|
-
<span v-if="!collapsed" class="
|
|
155
|
+
<span v-if="!collapsed" class="text-lg">
|
|
156
|
+
<span class="font-semibold">Arka</span><span class="arka-serif-accent text-primary">OS</span>
|
|
157
|
+
</span>
|
|
156
158
|
</div>
|
|
157
159
|
<div v-if="!collapsed" class="flex items-center gap-1">
|
|
158
160
|
<NotificationsBell />
|
|
@@ -162,6 +164,7 @@ const links = [[{
|
|
|
162
164
|
</template>
|
|
163
165
|
|
|
164
166
|
<template #default="{ collapsed }">
|
|
167
|
+
<ArkaNavGroupLabel v-if="!collapsed" label="workspace" />
|
|
165
168
|
<UNavigationMenu
|
|
166
169
|
:collapsed="collapsed"
|
|
167
170
|
:items="links[0]"
|
|
@@ -176,6 +179,7 @@ const links = [[{
|
|
|
176
179
|
<!-- PR87d v3.22.0 — quick stats widget above the bottom nav. -->
|
|
177
180
|
<SidebarStatsWidget v-if="!collapsed" />
|
|
178
181
|
|
|
182
|
+
<ArkaNavGroupLabel v-if="!collapsed" label="system" />
|
|
179
183
|
<UNavigationMenu
|
|
180
184
|
:collapsed="collapsed"
|
|
181
185
|
:items="links[1]"
|
|
@@ -184,8 +188,13 @@ const links = [[{
|
|
|
184
188
|
:class="collapsed ? 'mt-auto' : ''"
|
|
185
189
|
/>
|
|
186
190
|
</template>
|
|
191
|
+
|
|
192
|
+
<template #footer="{ collapsed }">
|
|
193
|
+
<ArkaSystemPill v-if="!collapsed" class="w-full justify-center" />
|
|
194
|
+
</template>
|
|
187
195
|
</UDashboardSidebar>
|
|
188
196
|
|
|
197
|
+
<ArkaStarfield />
|
|
189
198
|
<slot />
|
|
190
199
|
<KeyboardShortcutsHelp />
|
|
191
200
|
<GlobalSearch />
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// Internal reference page for the ArkaOS Pulse design system.
|
|
3
|
+
// Every visual decision on this page comes from tokens in main.css —
|
|
4
|
+
// if something here needs a hardcoded value, the token set is incomplete.
|
|
5
|
+
const surfaces = [
|
|
6
|
+
{ name: 'bg', varName: '--ui-bg', role: 'Page void' },
|
|
7
|
+
{ name: 'bg-muted', varName: '--ui-bg-muted', role: 'Quiet sections' },
|
|
8
|
+
{ name: 'bg-elevated', varName: '--ui-bg-elevated', role: 'Cards, panels' },
|
|
9
|
+
{ name: 'bg-accented', varName: '--ui-bg-accented', role: 'Hover, selection' }
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
const arkaScale = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
|
|
13
|
+
|
|
14
|
+
const semantics = [
|
|
15
|
+
{ label: 'live', class: 'bg-primary', meaning: 'Alive — live data, primary action' },
|
|
16
|
+
{ label: 'warning', class: 'bg-warning', meaning: 'Degraded, needs attention' },
|
|
17
|
+
{ label: 'error', class: 'bg-error', meaning: 'Failed, blocked' },
|
|
18
|
+
{ label: 'info', class: 'bg-info', meaning: 'Secondary data voice' }
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
const typeScale = [
|
|
22
|
+
{ size: 'text-4xl', px: '36', use: 'Page title', font: 'font-display' },
|
|
23
|
+
{ size: 'text-2xl', px: '24', use: 'Section heading', font: 'font-display' },
|
|
24
|
+
{ size: 'text-lg', px: '18', use: 'Card heading', font: 'font-display' },
|
|
25
|
+
{ size: 'text-base', px: '16', use: 'Body', font: 'font-sans' },
|
|
26
|
+
{ size: 'text-sm', px: '14', use: 'Secondary body', font: 'font-sans' },
|
|
27
|
+
{ size: 'text-xs', px: '12', use: 'Metadata', font: 'font-sans' }
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
const liveAgents = [
|
|
31
|
+
{ name: 'Paulo', dept: 'dev', status: 'executing', tasks: 12 },
|
|
32
|
+
{ name: 'Valentina', dept: 'brand', status: 'reviewing', tasks: 4 },
|
|
33
|
+
{ name: 'Marta', dept: 'quality', status: 'gate', tasks: 7 }
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
const streamKey = ref(0)
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<template>
|
|
40
|
+
<UDashboardPanel id="design-lab">
|
|
41
|
+
<template #header>
|
|
42
|
+
<UDashboardNavbar title="Design Lab">
|
|
43
|
+
<template #leading>
|
|
44
|
+
<UDashboardSidebarCollapse />
|
|
45
|
+
</template>
|
|
46
|
+
<template #trailing>
|
|
47
|
+
<span class="arka-data text-xs text-muted">pulse · v1</span>
|
|
48
|
+
</template>
|
|
49
|
+
</UDashboardNavbar>
|
|
50
|
+
</template>
|
|
51
|
+
<template #body>
|
|
52
|
+
<div class="mx-auto w-full max-w-5xl space-y-16 py-6">
|
|
53
|
+
<!-- Hero: the system introducing itself in its own vernacular -->
|
|
54
|
+
<header class="space-y-4">
|
|
55
|
+
<p class="arka-eyebrow">
|
|
56
|
+
arka://design-system · v1
|
|
57
|
+
</p>
|
|
58
|
+
<h1 class="font-display text-4xl font-bold tracking-tight">
|
|
59
|
+
ArkaOS Pulse
|
|
60
|
+
</h1>
|
|
61
|
+
<p class="max-w-2xl text-muted">
|
|
62
|
+
The dashboard is a living system: green means alive, motion means
|
|
63
|
+
data arriving, and silence means rest. Dark is the flagship mode.
|
|
64
|
+
</p>
|
|
65
|
+
<div class="arka-pulse-line max-w-2xl" aria-hidden="true" />
|
|
66
|
+
</header>
|
|
67
|
+
|
|
68
|
+
<!-- Surfaces -->
|
|
69
|
+
<section class="space-y-4">
|
|
70
|
+
<p class="arka-eyebrow">
|
|
71
|
+
surfaces
|
|
72
|
+
</p>
|
|
73
|
+
<div class="grid grid-cols-2 gap-3 sm:grid-cols-4">
|
|
74
|
+
<div
|
|
75
|
+
v-for="s in surfaces"
|
|
76
|
+
:key="s.name"
|
|
77
|
+
class="rounded-lg border border-default p-4"
|
|
78
|
+
:style="{ background: `var(${s.varName})` }"
|
|
79
|
+
>
|
|
80
|
+
<span class="arka-data block text-xs text-muted">{{ s.varName }}</span>
|
|
81
|
+
<span class="mt-6 block text-sm">{{ s.role }}</span>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</section>
|
|
85
|
+
|
|
86
|
+
<!-- Brand scale -->
|
|
87
|
+
<section class="space-y-4">
|
|
88
|
+
<p class="arka-eyebrow">
|
|
89
|
+
arka · signal green
|
|
90
|
+
</p>
|
|
91
|
+
<div class="flex overflow-hidden rounded-lg border border-default">
|
|
92
|
+
<div
|
|
93
|
+
v-for="step in arkaScale"
|
|
94
|
+
:key="step"
|
|
95
|
+
class="flex h-20 min-w-0 flex-1 items-end justify-center pb-2"
|
|
96
|
+
:style="{ background: `var(--color-arka-${step})` }"
|
|
97
|
+
>
|
|
98
|
+
<span
|
|
99
|
+
class="arka-data text-[10px]"
|
|
100
|
+
:class="step < 500 ? 'text-carbon-950' : 'text-carbon-50'"
|
|
101
|
+
>{{ step }}</span>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="grid gap-2 sm:grid-cols-2">
|
|
105
|
+
<div
|
|
106
|
+
v-for="s in semantics"
|
|
107
|
+
:key="s.label"
|
|
108
|
+
class="flex items-center gap-3 rounded-lg border border-default bg-elevated p-3"
|
|
109
|
+
>
|
|
110
|
+
<span class="size-3 rounded-full" :class="s.class" />
|
|
111
|
+
<span class="arka-data text-xs uppercase">{{ s.label }}</span>
|
|
112
|
+
<span class="text-sm text-muted">{{ s.meaning }}</span>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</section>
|
|
116
|
+
|
|
117
|
+
<!-- Typography -->
|
|
118
|
+
<section class="space-y-4">
|
|
119
|
+
<p class="arka-eyebrow">
|
|
120
|
+
typography
|
|
121
|
+
</p>
|
|
122
|
+
<div class="space-y-3 rounded-lg border border-default bg-elevated p-6">
|
|
123
|
+
<div
|
|
124
|
+
v-for="t in typeScale"
|
|
125
|
+
:key="t.size"
|
|
126
|
+
class="flex items-baseline gap-6 border-b border-muted pb-3 last:border-0 last:pb-0"
|
|
127
|
+
>
|
|
128
|
+
<span class="arka-data w-10 shrink-0 text-xs text-muted">{{ t.px }}</span>
|
|
129
|
+
<span :class="[t.size, t.font]" class="truncate">
|
|
130
|
+
Agents ship, gates verify
|
|
131
|
+
</span>
|
|
132
|
+
<span class="ml-auto shrink-0 text-xs text-muted">{{ t.use }}</span>
|
|
133
|
+
</div>
|
|
134
|
+
<p class="arka-data pt-2 text-sm">
|
|
135
|
+
data: 86 agents · 17 departments · uptime 99.98% · 142,842 tokens
|
|
136
|
+
</p>
|
|
137
|
+
</div>
|
|
138
|
+
</section>
|
|
139
|
+
|
|
140
|
+
<!-- Motion -->
|
|
141
|
+
<section class="space-y-4">
|
|
142
|
+
<p class="arka-eyebrow">
|
|
143
|
+
motion · one rhythm
|
|
144
|
+
</p>
|
|
145
|
+
<div class="grid gap-3 sm:grid-cols-3">
|
|
146
|
+
<UCard>
|
|
147
|
+
<div class="flex items-center gap-3">
|
|
148
|
+
<span class="arka-live-dot" />
|
|
149
|
+
<div>
|
|
150
|
+
<p class="text-sm font-medium">
|
|
151
|
+
Pulse
|
|
152
|
+
</p>
|
|
153
|
+
<p class="text-xs text-muted">
|
|
154
|
+
Only what is live may breathe
|
|
155
|
+
</p>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</UCard>
|
|
159
|
+
<UCard>
|
|
160
|
+
<div class="space-y-2">
|
|
161
|
+
<p class="text-sm font-medium">
|
|
162
|
+
Stream-in
|
|
163
|
+
</p>
|
|
164
|
+
<div :key="streamKey" class="space-y-1">
|
|
165
|
+
<div
|
|
166
|
+
v-for="(a, i) in liveAgents"
|
|
167
|
+
:key="a.name"
|
|
168
|
+
class="arka-stream-in flex items-center gap-2 text-xs"
|
|
169
|
+
:style="{ animationDelay: `calc(var(--arka-stagger-step) * ${i})` }"
|
|
170
|
+
>
|
|
171
|
+
<span class="size-1.5 rounded-full bg-primary" />
|
|
172
|
+
<span>{{ a.name }}</span>
|
|
173
|
+
<span class="arka-data ml-auto text-muted">{{ a.status }}</span>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<UButton size="xs" variant="ghost" @click="streamKey++">
|
|
177
|
+
Replay
|
|
178
|
+
</UButton>
|
|
179
|
+
</div>
|
|
180
|
+
</UCard>
|
|
181
|
+
<UCard>
|
|
182
|
+
<div class="space-y-2">
|
|
183
|
+
<p class="text-sm font-medium">
|
|
184
|
+
Durations
|
|
185
|
+
</p>
|
|
186
|
+
<p class="arka-data text-xs text-muted">
|
|
187
|
+
fast 150ms · base 240ms · slow 400ms
|
|
188
|
+
</p>
|
|
189
|
+
<p class="text-xs text-muted">
|
|
190
|
+
Enter decelerates; exit runs at ~65% of enter. Respects reduced motion.
|
|
191
|
+
</p>
|
|
192
|
+
</div>
|
|
193
|
+
</UCard>
|
|
194
|
+
</div>
|
|
195
|
+
</section>
|
|
196
|
+
|
|
197
|
+
<!-- Components in theme -->
|
|
198
|
+
<section class="space-y-4">
|
|
199
|
+
<p class="arka-eyebrow">
|
|
200
|
+
components
|
|
201
|
+
</p>
|
|
202
|
+
<UCard>
|
|
203
|
+
<div class="flex flex-wrap items-center gap-3">
|
|
204
|
+
<UButton>Dispatch agent</UButton>
|
|
205
|
+
<UButton variant="outline">
|
|
206
|
+
Review
|
|
207
|
+
</UButton>
|
|
208
|
+
<UButton variant="ghost">
|
|
209
|
+
Cancel
|
|
210
|
+
</UButton>
|
|
211
|
+
<UButton color="error" variant="soft">
|
|
212
|
+
Stop run
|
|
213
|
+
</UButton>
|
|
214
|
+
<UBadge variant="subtle">
|
|
215
|
+
APPROVED
|
|
216
|
+
</UBadge>
|
|
217
|
+
<UBadge color="warning" variant="subtle">
|
|
218
|
+
PENDING
|
|
219
|
+
</UBadge>
|
|
220
|
+
<USwitch default-value />
|
|
221
|
+
</div>
|
|
222
|
+
</UCard>
|
|
223
|
+
<UCard>
|
|
224
|
+
<template #header>
|
|
225
|
+
<div class="flex items-center gap-3">
|
|
226
|
+
<span class="arka-live-dot" />
|
|
227
|
+
<span class="font-display text-lg font-semibold">Live squad</span>
|
|
228
|
+
<span class="arka-data ml-auto text-xs text-muted">3 active</span>
|
|
229
|
+
</div>
|
|
230
|
+
</template>
|
|
231
|
+
<ul class="divide-y divide-default">
|
|
232
|
+
<li
|
|
233
|
+
v-for="a in liveAgents"
|
|
234
|
+
:key="a.name"
|
|
235
|
+
class="flex items-center gap-4 py-3 first:pt-0 last:pb-0"
|
|
236
|
+
>
|
|
237
|
+
<UAvatar :alt="a.name" size="sm" />
|
|
238
|
+
<div>
|
|
239
|
+
<p class="text-sm font-medium">
|
|
240
|
+
{{ a.name }}
|
|
241
|
+
</p>
|
|
242
|
+
<p class="text-xs text-muted">
|
|
243
|
+
{{ a.dept }}
|
|
244
|
+
</p>
|
|
245
|
+
</div>
|
|
246
|
+
<span class="arka-data ml-auto text-xs">{{ a.tasks }} tasks</span>
|
|
247
|
+
<UBadge variant="subtle" size="sm">
|
|
248
|
+
{{ a.status }}
|
|
249
|
+
</UBadge>
|
|
250
|
+
</li>
|
|
251
|
+
</ul>
|
|
252
|
+
</UCard>
|
|
253
|
+
</section>
|
|
254
|
+
</div>
|
|
255
|
+
</template>
|
|
256
|
+
</UDashboardPanel>
|
|
257
|
+
</template>
|