arkaos 2.2.2 → 2.3.1
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/arka/skills/conclave/SKILL.md +194 -0
- package/arka/skills/human-writing/SKILL.md +143 -0
- package/config/agent-memory-template.md +28 -0
- package/config/disc-profiles.json +108 -0
- package/config/disc-team-validator.sh +94 -0
- package/config/gotchas-fixes.json +148 -0
- package/config/profile-template.json +12 -0
- package/config/providers-registry.json +56 -0
- package/config/settings-template.json +42 -0
- package/config/standards/communication.md +64 -0
- package/config/standards/orchestration.md +91 -0
- package/config/statusline-v2.sh +101 -0
- package/config/statusline.sh +139 -0
- package/config/system-prompt.sh +190 -0
- package/dashboard/LICENSE +21 -0
- package/dashboard/README.md +64 -0
- package/dashboard/app/app.config.ts +8 -0
- package/dashboard/app/app.vue +42 -0
- package/dashboard/app/assets/css/main.css +18 -0
- package/dashboard/app/composables/useApi.ts +8 -0
- package/dashboard/app/composables/useDashboard.ts +19 -0
- package/dashboard/app/error.vue +24 -0
- package/dashboard/app/layouts/default.vue +114 -0
- package/dashboard/app/pages/agents/[id].vue +506 -0
- package/dashboard/app/pages/agents/index.vue +225 -0
- package/dashboard/app/pages/budget.vue +132 -0
- package/dashboard/app/pages/commands.vue +180 -0
- package/dashboard/app/pages/health.vue +98 -0
- package/dashboard/app/pages/index.vue +126 -0
- package/dashboard/app/pages/knowledge.vue +729 -0
- package/dashboard/app/pages/personas.vue +597 -0
- package/dashboard/app/pages/settings.vue +146 -0
- package/dashboard/app/pages/tasks.vue +203 -0
- package/dashboard/app/types/index.d.ts +181 -0
- package/dashboard/app/utils/index.ts +7 -0
- package/dashboard/nuxt.config.ts +39 -0
- package/dashboard/package.json +37 -0
- package/dashboard/pnpm-workspace.yaml +7 -0
- package/dashboard/tsconfig.json +10 -0
- package/installer/cli.js +0 -0
- package/installer/index.js +262 -62
- package/knowledge/INDEX.md +34 -0
- package/knowledge/agents-registry.json +254 -0
- package/knowledge/channels-config.json +6 -0
- package/knowledge/commands-keywords.json +466 -0
- package/knowledge/commands-registry.json +2791 -0
- package/knowledge/commands-registry.json.bak +2791 -0
- package/knowledge/ecosystems.json +7 -0
- package/knowledge/obsidian-config.json +112 -0
- package/package.json +10 -6
- package/pyproject.toml +1 -1
- package/scripts/check-version.js +13 -0
- package/scripts/dashboard-api.py +636 -0
- package/scripts/knowledge-index.py +113 -0
- package/scripts/skill_validator.py +217 -0
- package/scripts/start-dashboard.sh +54 -0
- package/scripts/synapse-bridge.py +199 -0
- package/scripts/tools/brand_voice_analyzer.py +192 -0
- package/scripts/tools/dcf_calculator.py +168 -0
- package/scripts/tools/headline_scorer.py +215 -0
- package/scripts/tools/okr_cascade.py +207 -0
- package/scripts/tools/rice_prioritizer.py +230 -0
- package/scripts/tools/saas_metrics.py +234 -0
- package/scripts/tools/seo_checker.py +197 -0
- package/scripts/tools/tech_debt_analyzer.py +206 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const { fetchApi, apiBase } = useApi()
|
|
3
|
+
|
|
4
|
+
const { data, status, error, refresh } = fetchApi<any>('/api/keys')
|
|
5
|
+
|
|
6
|
+
const keys = computed(() => data.value?.keys ?? [])
|
|
7
|
+
|
|
8
|
+
const newKey = ref('')
|
|
9
|
+
const newValue = ref('')
|
|
10
|
+
const saving = ref(false)
|
|
11
|
+
const deletingKey = ref<string | null>(null)
|
|
12
|
+
|
|
13
|
+
async function saveKey() {
|
|
14
|
+
if (!newKey.value || !newValue.value) return
|
|
15
|
+
saving.value = true
|
|
16
|
+
try {
|
|
17
|
+
await $fetch(`${apiBase}/api/keys`, {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
body: { key: newKey.value, value: newValue.value },
|
|
20
|
+
})
|
|
21
|
+
newKey.value = ''
|
|
22
|
+
newValue.value = ''
|
|
23
|
+
await refresh()
|
|
24
|
+
} catch {}
|
|
25
|
+
saving.value = false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function deleteKey(keyName: string) {
|
|
29
|
+
deletingKey.value = keyName
|
|
30
|
+
try {
|
|
31
|
+
await $fetch(`${apiBase}/api/keys/${keyName}`, { method: 'DELETE' })
|
|
32
|
+
await refresh()
|
|
33
|
+
} catch {}
|
|
34
|
+
deletingKey.value = null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const keyOptions = [
|
|
38
|
+
{ label: 'OPENAI_API_KEY', value: 'OPENAI_API_KEY' },
|
|
39
|
+
{ label: 'FAL_API_KEY', value: 'FAL_API_KEY' },
|
|
40
|
+
{ label: 'GOOGLE_API_KEY', value: 'GOOGLE_API_KEY' },
|
|
41
|
+
{ label: 'Custom...', value: 'custom' },
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
const isCustom = computed(() => newKey.value === 'custom')
|
|
45
|
+
const customKeyName = ref('')
|
|
46
|
+
const effectiveKeyName = computed(() => isCustom.value ? customKeyName.value : newKey.value)
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<template>
|
|
50
|
+
<UDashboardPanel id="settings">
|
|
51
|
+
<template #header>
|
|
52
|
+
<UDashboardNavbar title="Settings">
|
|
53
|
+
<template #leading>
|
|
54
|
+
<UDashboardSidebarCollapse />
|
|
55
|
+
</template>
|
|
56
|
+
</UDashboardNavbar>
|
|
57
|
+
</template>
|
|
58
|
+
|
|
59
|
+
<template #body>
|
|
60
|
+
<div class="space-y-8">
|
|
61
|
+
<!-- API Keys Section -->
|
|
62
|
+
<div>
|
|
63
|
+
<h2 class="text-lg font-semibold mb-1">API Keys</h2>
|
|
64
|
+
<p class="text-sm text-muted mb-6">Configure API keys for external services. Keys are stored locally at ~/.arkaos/keys.json.</p>
|
|
65
|
+
|
|
66
|
+
<!-- Add Key Form -->
|
|
67
|
+
<UCard class="mb-6">
|
|
68
|
+
<div class="space-y-4">
|
|
69
|
+
<p class="text-xs font-semibold text-muted uppercase tracking-wider">Add API Key</p>
|
|
70
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-3 items-end">
|
|
71
|
+
<div>
|
|
72
|
+
<label class="text-xs text-muted mb-1 block">Provider</label>
|
|
73
|
+
<USelect v-model="newKey" :items="keyOptions" class="w-full" placeholder="Select key..." />
|
|
74
|
+
</div>
|
|
75
|
+
<div v-if="isCustom">
|
|
76
|
+
<label class="text-xs text-muted mb-1 block">Key Name</label>
|
|
77
|
+
<UInput v-model="customKeyName" class="w-full" placeholder="MY_CUSTOM_KEY" />
|
|
78
|
+
</div>
|
|
79
|
+
<div :class="isCustom ? '' : 'md:col-span-1'">
|
|
80
|
+
<label class="text-xs text-muted mb-1 block">Value</label>
|
|
81
|
+
<UInput v-model="newValue" type="password" class="w-full" placeholder="sk-..." />
|
|
82
|
+
</div>
|
|
83
|
+
<div>
|
|
84
|
+
<UButton
|
|
85
|
+
label="Save Key"
|
|
86
|
+
icon="i-lucide-key"
|
|
87
|
+
:loading="saving"
|
|
88
|
+
:disabled="!effectiveKeyName || !newValue"
|
|
89
|
+
@click="() => { newKey = effectiveKeyName; saveKey() }"
|
|
90
|
+
block
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</UCard>
|
|
96
|
+
|
|
97
|
+
<!-- Keys List -->
|
|
98
|
+
<div v-if="status === 'pending'" class="flex items-center justify-center py-8">
|
|
99
|
+
<UIcon name="i-lucide-loader-2" class="size-6 animate-spin text-muted" />
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<div v-else class="space-y-2">
|
|
103
|
+
<div
|
|
104
|
+
v-for="k in keys"
|
|
105
|
+
:key="k.key"
|
|
106
|
+
class="flex items-center gap-4 p-3 rounded-lg border border-default"
|
|
107
|
+
>
|
|
108
|
+
<div class="flex-1 min-w-0">
|
|
109
|
+
<div class="flex items-center gap-2">
|
|
110
|
+
<span class="text-sm font-mono font-medium">{{ k.key }}</span>
|
|
111
|
+
<UBadge :label="k.provider" variant="subtle" size="xs" />
|
|
112
|
+
<UBadge
|
|
113
|
+
v-if="k.configured"
|
|
114
|
+
label="Configured"
|
|
115
|
+
color="success"
|
|
116
|
+
variant="subtle"
|
|
117
|
+
size="xs"
|
|
118
|
+
/>
|
|
119
|
+
<UBadge
|
|
120
|
+
v-else
|
|
121
|
+
label="Not Set"
|
|
122
|
+
color="neutral"
|
|
123
|
+
variant="outline"
|
|
124
|
+
size="xs"
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
<p v-if="k.used_for" class="text-xs text-muted mt-0.5">{{ k.used_for }}</p>
|
|
128
|
+
<p v-if="k.masked_value && k.configured" class="text-xs font-mono text-muted/60 mt-0.5">{{ k.masked_value }}</p>
|
|
129
|
+
</div>
|
|
130
|
+
<UButton
|
|
131
|
+
v-if="k.configured && k.masked_value !== '(from environment)'"
|
|
132
|
+
icon="i-lucide-trash-2"
|
|
133
|
+
variant="ghost"
|
|
134
|
+
color="error"
|
|
135
|
+
size="xs"
|
|
136
|
+
:loading="deletingKey === k.key"
|
|
137
|
+
@click="deleteKey(k.key)"
|
|
138
|
+
aria-label="Delete key"
|
|
139
|
+
/>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</template>
|
|
145
|
+
</UDashboardPanel>
|
|
146
|
+
</template>
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { TableColumn } from '@nuxt/ui'
|
|
3
|
+
import type { Task, TaskSummary } from '~/types'
|
|
4
|
+
|
|
5
|
+
const { fetchApi } = useApi()
|
|
6
|
+
|
|
7
|
+
const { data, status, error, refresh } = await fetchApi<{ tasks: Task[], summary: TaskSummary }>('/api/tasks')
|
|
8
|
+
|
|
9
|
+
const tasks = computed(() => data.value?.tasks ?? [])
|
|
10
|
+
const summary = computed(() => data.value?.summary ?? { total: 0, active: 0, queued: 0, completed: 0 })
|
|
11
|
+
|
|
12
|
+
const activeTab = ref('all')
|
|
13
|
+
|
|
14
|
+
const tabItems = [
|
|
15
|
+
{ label: 'All', value: 'all' },
|
|
16
|
+
{ label: 'Active', value: 'active' },
|
|
17
|
+
{ label: 'Queued', value: 'queued' },
|
|
18
|
+
{ label: 'Completed', value: 'completed' },
|
|
19
|
+
{ label: 'Failed', value: 'failed' }
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
const filteredTasks = computed(() => {
|
|
23
|
+
if (activeTab.value === 'all') return tasks.value
|
|
24
|
+
return tasks.value.filter(t => {
|
|
25
|
+
if (activeTab.value === 'active') return t.status === 'processing' || t.status === 'active'
|
|
26
|
+
return t.status === activeTab.value
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
type StatusColorType = 'success' | 'error' | 'primary' | 'warning' | 'neutral'
|
|
31
|
+
|
|
32
|
+
function statusColor(taskStatus: string): StatusColorType {
|
|
33
|
+
const colors: Record<string, StatusColorType> = {
|
|
34
|
+
completed: 'success',
|
|
35
|
+
processing: 'primary',
|
|
36
|
+
active: 'primary',
|
|
37
|
+
queued: 'neutral',
|
|
38
|
+
failed: 'error',
|
|
39
|
+
cancelled: 'warning'
|
|
40
|
+
}
|
|
41
|
+
return colors[taskStatus] ?? 'neutral'
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function formatDate(dateStr: string) {
|
|
45
|
+
if (!dateStr) return '-'
|
|
46
|
+
try {
|
|
47
|
+
return new Intl.DateTimeFormat('en-US', {
|
|
48
|
+
month: 'short',
|
|
49
|
+
day: 'numeric',
|
|
50
|
+
hour: '2-digit',
|
|
51
|
+
minute: '2-digit'
|
|
52
|
+
}).format(new Date(dateStr))
|
|
53
|
+
} catch {
|
|
54
|
+
return dateStr
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const columns: TableColumn<Task>[] = [
|
|
59
|
+
{
|
|
60
|
+
accessorKey: 'agent',
|
|
61
|
+
header: 'Type'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
accessorKey: 'title',
|
|
65
|
+
header: 'Title'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
accessorKey: 'department',
|
|
69
|
+
header: 'Department'
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
accessorKey: 'status',
|
|
73
|
+
header: 'Status'
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
accessorKey: 'progress',
|
|
77
|
+
header: 'Progress'
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
accessorKey: 'created_at',
|
|
81
|
+
header: 'Created'
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
</script>
|
|
85
|
+
|
|
86
|
+
<template>
|
|
87
|
+
<UDashboardPanel id="tasks">
|
|
88
|
+
<template #header>
|
|
89
|
+
<UDashboardNavbar title="Tasks">
|
|
90
|
+
<template #leading>
|
|
91
|
+
<UDashboardSidebarCollapse />
|
|
92
|
+
</template>
|
|
93
|
+
</UDashboardNavbar>
|
|
94
|
+
</template>
|
|
95
|
+
|
|
96
|
+
<template #body>
|
|
97
|
+
<!-- Loading -->
|
|
98
|
+
<div v-if="status === 'pending'" class="flex items-center justify-center py-12">
|
|
99
|
+
<UIcon name="i-lucide-loader-2" class="size-8 animate-spin text-muted" />
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<!-- Error -->
|
|
103
|
+
<div v-else-if="error" class="flex flex-col items-center justify-center gap-4 py-12" role="alert">
|
|
104
|
+
<UIcon name="i-lucide-alert-triangle" class="size-12 text-red-500" />
|
|
105
|
+
<p class="text-sm text-muted">Failed to load tasks.</p>
|
|
106
|
+
<UButton label="Retry" variant="outline" color="primary" icon="i-lucide-refresh-cw" @click="refresh()" />
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<!-- Content -->
|
|
110
|
+
<template v-else>
|
|
111
|
+
<!-- Summary Cards -->
|
|
112
|
+
<div class="grid grid-cols-2 gap-4 sm:grid-cols-4">
|
|
113
|
+
<div class="rounded-lg border border-default p-4 text-center">
|
|
114
|
+
<p class="text-2xl font-semibold text-highlighted">{{ summary.total }}</p>
|
|
115
|
+
<p class="text-xs text-muted">Total</p>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="rounded-lg border border-default p-4 text-center">
|
|
118
|
+
<p class="text-2xl font-semibold text-primary">{{ summary.active }}</p>
|
|
119
|
+
<p class="text-xs text-muted">Active</p>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="rounded-lg border border-default p-4 text-center">
|
|
122
|
+
<p class="text-2xl font-semibold text-yellow-500">{{ summary.queued }}</p>
|
|
123
|
+
<p class="text-xs text-muted">Queued</p>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="rounded-lg border border-default p-4 text-center">
|
|
126
|
+
<p class="text-2xl font-semibold text-green-500">{{ summary.completed }}</p>
|
|
127
|
+
<p class="text-xs text-muted">Completed</p>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<!-- Status Filter Tabs -->
|
|
132
|
+
<div class="mt-6">
|
|
133
|
+
<UTabs
|
|
134
|
+
:items="tabItems"
|
|
135
|
+
:model-value="activeTab"
|
|
136
|
+
@update:model-value="activeTab = $event as string"
|
|
137
|
+
/>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<!-- Empty State -->
|
|
141
|
+
<div v-if="!tasks.length" class="mt-6 flex flex-col items-center justify-center gap-4 py-16">
|
|
142
|
+
<UIcon name="i-lucide-list-checks" class="size-16 text-muted" />
|
|
143
|
+
<h3 class="text-lg font-semibold text-highlighted">No tasks yet</h3>
|
|
144
|
+
<p class="text-sm text-muted text-center max-w-md">
|
|
145
|
+
Tasks are created when you run ArkaOS workflows. Start by indexing your project or running a command.
|
|
146
|
+
</p>
|
|
147
|
+
<div class="mt-2 rounded-lg border border-default bg-elevated/50 px-4 py-3">
|
|
148
|
+
<p class="text-xs text-muted mb-1">Try running:</p>
|
|
149
|
+
<code class="font-mono text-sm text-primary">npx arkaos index</code>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<!-- Filtered Empty -->
|
|
154
|
+
<div v-else-if="!filteredTasks.length" class="mt-6 flex flex-col items-center justify-center gap-4 py-12">
|
|
155
|
+
<UIcon name="i-lucide-filter-x" class="size-12 text-muted" />
|
|
156
|
+
<p class="text-sm text-muted">No {{ activeTab }} tasks found.</p>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<!-- Task Table -->
|
|
160
|
+
<div v-else class="mt-4">
|
|
161
|
+
<UTable
|
|
162
|
+
:data="filteredTasks"
|
|
163
|
+
:columns="columns"
|
|
164
|
+
:loading="status === 'pending'"
|
|
165
|
+
class="shrink-0"
|
|
166
|
+
:ui="{
|
|
167
|
+
base: 'table-fixed border-separate border-spacing-0',
|
|
168
|
+
thead: '[&>tr]:bg-elevated/50 [&>tr]:after:content-none',
|
|
169
|
+
tbody: '[&>tr]:last:[&>td]:border-b-0',
|
|
170
|
+
th: 'py-2 first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r',
|
|
171
|
+
td: 'border-b border-default'
|
|
172
|
+
}"
|
|
173
|
+
>
|
|
174
|
+
<template #agent-cell="{ row }">
|
|
175
|
+
<UBadge :label="row.original.agent" variant="subtle" color="primary" size="sm" />
|
|
176
|
+
</template>
|
|
177
|
+
<template #department-cell="{ row }">
|
|
178
|
+
<span class="text-sm text-muted">{{ row.original.department }}</span>
|
|
179
|
+
</template>
|
|
180
|
+
<template #status-cell="{ row }">
|
|
181
|
+
<UBadge
|
|
182
|
+
:label="row.original.status"
|
|
183
|
+
:color="statusColor(row.original.status)"
|
|
184
|
+
variant="subtle"
|
|
185
|
+
size="sm"
|
|
186
|
+
class="capitalize"
|
|
187
|
+
/>
|
|
188
|
+
</template>
|
|
189
|
+
<template #progress-cell="{ row }">
|
|
190
|
+
<div class="flex items-center gap-2 min-w-24">
|
|
191
|
+
<UProgress :value="row.original.progress" :max="100" size="xs" class="flex-1" />
|
|
192
|
+
<span class="text-xs text-muted font-mono w-8 text-right">{{ row.original.progress }}%</span>
|
|
193
|
+
</div>
|
|
194
|
+
</template>
|
|
195
|
+
<template #created_at-cell="{ row }">
|
|
196
|
+
<span class="text-xs text-muted">{{ formatDate(row.original.created_at) }}</span>
|
|
197
|
+
</template>
|
|
198
|
+
</UTable>
|
|
199
|
+
</div>
|
|
200
|
+
</template>
|
|
201
|
+
</template>
|
|
202
|
+
</UDashboardPanel>
|
|
203
|
+
</template>
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
export interface OverviewData {
|
|
2
|
+
agents: number
|
|
3
|
+
skills: number
|
|
4
|
+
departments: number
|
|
5
|
+
tests: number
|
|
6
|
+
commands: number
|
|
7
|
+
workflows: number
|
|
8
|
+
version: string
|
|
9
|
+
budget: {
|
|
10
|
+
allocated: number
|
|
11
|
+
used: number
|
|
12
|
+
percent_used: number
|
|
13
|
+
is_unlimited: boolean
|
|
14
|
+
}
|
|
15
|
+
tasks: {
|
|
16
|
+
total: number
|
|
17
|
+
active: number
|
|
18
|
+
queued: number
|
|
19
|
+
}
|
|
20
|
+
knowledge: {
|
|
21
|
+
total_chunks: number
|
|
22
|
+
total_files: number
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Agent {
|
|
27
|
+
id: string
|
|
28
|
+
name: string
|
|
29
|
+
role: string
|
|
30
|
+
department: string
|
|
31
|
+
tier: number
|
|
32
|
+
disc: {
|
|
33
|
+
primary: string
|
|
34
|
+
secondary?: string
|
|
35
|
+
description?: string
|
|
36
|
+
}
|
|
37
|
+
enneagram: {
|
|
38
|
+
type: string
|
|
39
|
+
wing?: string
|
|
40
|
+
label?: string
|
|
41
|
+
}
|
|
42
|
+
big_five: {
|
|
43
|
+
O: number
|
|
44
|
+
C: number
|
|
45
|
+
E: number
|
|
46
|
+
A: number
|
|
47
|
+
N: number
|
|
48
|
+
}
|
|
49
|
+
mbti: string
|
|
50
|
+
expertise_domains: string[]
|
|
51
|
+
frameworks: string[]
|
|
52
|
+
authority?: {
|
|
53
|
+
veto?: boolean
|
|
54
|
+
approve_budget?: boolean
|
|
55
|
+
approve_architecture?: boolean
|
|
56
|
+
orchestrate?: boolean
|
|
57
|
+
block_release?: boolean
|
|
58
|
+
delegates_to?: string[]
|
|
59
|
+
escalates_to?: string[]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface Command {
|
|
64
|
+
id: string
|
|
65
|
+
command: string
|
|
66
|
+
department: string
|
|
67
|
+
description: string
|
|
68
|
+
keywords?: string[]
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface BudgetTier {
|
|
72
|
+
tier: number
|
|
73
|
+
allocated: number
|
|
74
|
+
used: number
|
|
75
|
+
remaining: number
|
|
76
|
+
percent_used: number
|
|
77
|
+
status: string
|
|
78
|
+
is_unlimited: boolean
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface Task {
|
|
82
|
+
id: string
|
|
83
|
+
title: string
|
|
84
|
+
status: string
|
|
85
|
+
agent: string
|
|
86
|
+
department: string
|
|
87
|
+
progress: number
|
|
88
|
+
created_at: string
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface TaskSummary {
|
|
92
|
+
total: number
|
|
93
|
+
active: number
|
|
94
|
+
queued: number
|
|
95
|
+
completed: number
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface KnowledgeStats {
|
|
99
|
+
total_chunks: number
|
|
100
|
+
total_files: number
|
|
101
|
+
vss_available?: boolean
|
|
102
|
+
areas?: {
|
|
103
|
+
name: string
|
|
104
|
+
chunks: number
|
|
105
|
+
files: number
|
|
106
|
+
}[]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface KnowledgeSearchResult {
|
|
110
|
+
id?: string
|
|
111
|
+
text?: string
|
|
112
|
+
content?: string
|
|
113
|
+
heading?: string
|
|
114
|
+
source?: string
|
|
115
|
+
area?: string
|
|
116
|
+
score: number
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface IngestRequest {
|
|
120
|
+
source: string
|
|
121
|
+
type: 'youtube' | 'web' | 'pdf' | 'audio' | 'markdown'
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface IngestResponse {
|
|
125
|
+
task_id: string
|
|
126
|
+
source_type: string
|
|
127
|
+
status: string
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface IngestTask {
|
|
131
|
+
id: string
|
|
132
|
+
title: string
|
|
133
|
+
status: 'queued' | 'processing' | 'completed' | 'failed'
|
|
134
|
+
progress_percent: number
|
|
135
|
+
progress_message: string
|
|
136
|
+
output_data?: {
|
|
137
|
+
chunks_created?: number
|
|
138
|
+
[key: string]: unknown
|
|
139
|
+
}
|
|
140
|
+
error?: string
|
|
141
|
+
source_type?: string
|
|
142
|
+
created_at?: string
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface HealthCheck {
|
|
146
|
+
name: string
|
|
147
|
+
passed: boolean
|
|
148
|
+
fix: string
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface Persona {
|
|
152
|
+
id: string
|
|
153
|
+
name: string
|
|
154
|
+
title: string
|
|
155
|
+
tagline: string
|
|
156
|
+
source: string
|
|
157
|
+
mbti: string
|
|
158
|
+
disc: {
|
|
159
|
+
primary: string
|
|
160
|
+
secondary: string
|
|
161
|
+
}
|
|
162
|
+
enneagram: {
|
|
163
|
+
type: number
|
|
164
|
+
wing: number
|
|
165
|
+
}
|
|
166
|
+
big_five: {
|
|
167
|
+
openness: number
|
|
168
|
+
conscientiousness: number
|
|
169
|
+
extraversion: number
|
|
170
|
+
agreeableness: number
|
|
171
|
+
neuroticism: number
|
|
172
|
+
}
|
|
173
|
+
mental_models: string[]
|
|
174
|
+
expertise_domains: string[]
|
|
175
|
+
frameworks: string[]
|
|
176
|
+
communication: {
|
|
177
|
+
tone: string
|
|
178
|
+
vocabulary_level: string
|
|
179
|
+
}
|
|
180
|
+
cloned_to_agents: string[]
|
|
181
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// https://nuxt.com/docs/api/configuration/nuxt-config
|
|
2
|
+
export default defineNuxtConfig({
|
|
3
|
+
modules: [
|
|
4
|
+
'@nuxt/eslint',
|
|
5
|
+
'@nuxt/ui',
|
|
6
|
+
'@vueuse/nuxt'
|
|
7
|
+
],
|
|
8
|
+
|
|
9
|
+
ssr: false,
|
|
10
|
+
|
|
11
|
+
devtools: {
|
|
12
|
+
enabled: true
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
css: ['~/assets/css/main.css'],
|
|
16
|
+
|
|
17
|
+
runtimeConfig: {
|
|
18
|
+
public: {
|
|
19
|
+
apiBase: 'http://localhost:3334'
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
routeRules: {
|
|
24
|
+
'/api/**': {
|
|
25
|
+
cors: true
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
compatibilityDate: '2024-07-11',
|
|
30
|
+
|
|
31
|
+
eslint: {
|
|
32
|
+
config: {
|
|
33
|
+
stylistic: {
|
|
34
|
+
commaDangle: 'never',
|
|
35
|
+
braceStyle: '1tbs'
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nuxt-ui-template-dashboard",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "nuxt build",
|
|
7
|
+
"dev": "nuxt dev",
|
|
8
|
+
"preview": "nuxt preview",
|
|
9
|
+
"postinstall": "nuxt prepare",
|
|
10
|
+
"lint": "eslint .",
|
|
11
|
+
"typecheck": "nuxt typecheck"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@iconify-json/lucide": "^1.2.100",
|
|
15
|
+
"@iconify-json/simple-icons": "^1.2.75",
|
|
16
|
+
"@internationalized/date": "^3.12.0",
|
|
17
|
+
"@nuxt/ui": "^4.6.0",
|
|
18
|
+
"@tanstack/table-core": "^8.21.3",
|
|
19
|
+
"@unovis/ts": "^1.6.4",
|
|
20
|
+
"@unovis/vue": "^1.6.4",
|
|
21
|
+
"@vueuse/core": "^14.2.1",
|
|
22
|
+
"@vueuse/nuxt": "^14.2.1",
|
|
23
|
+
"date-fns": "^4.1.0",
|
|
24
|
+
"nuxt": "^4.4.2",
|
|
25
|
+
"scule": "^1.3.0",
|
|
26
|
+
"tailwindcss": "^4.2.2",
|
|
27
|
+
"vue": "^3.5.31",
|
|
28
|
+
"zod": "^4.3.6"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@nuxt/eslint": "^1.15.2",
|
|
32
|
+
"eslint": "^10.1.0",
|
|
33
|
+
"typescript": "^6.0.2",
|
|
34
|
+
"vue-tsc": "^3.2.6"
|
|
35
|
+
},
|
|
36
|
+
"packageManager": "pnpm@10.33.0"
|
|
37
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
// https://nuxt.com/docs/guide/concepts/typescript
|
|
3
|
+
"files": [],
|
|
4
|
+
"references": [
|
|
5
|
+
{ "path": "./.nuxt/tsconfig.app.json" },
|
|
6
|
+
{ "path": "./.nuxt/tsconfig.server.json" },
|
|
7
|
+
{ "path": "./.nuxt/tsconfig.shared.json" },
|
|
8
|
+
{ "path": "./.nuxt/tsconfig.node.json" }
|
|
9
|
+
]
|
|
10
|
+
}
|
package/installer/cli.js
CHANGED
|
File without changes
|