django-agent-studio 0.3.2__py3-none-any.whl → 0.3.4__py3-none-any.whl
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.
- django_agent_studio/agents/dynamic.py +164 -4
- django_agent_studio/api/serializers.py +27 -8
- django_agent_studio/branding.py +103 -0
- django_agent_studio/static/agent-frontend/chat-widget.css +58 -1
- django_agent_studio/static/agent-frontend/chat-widget.js +222 -206
- django_agent_studio/static/django_agent_studio/js/builder.js +58 -58
- django_agent_studio/static/django_agent_studio/js/builder.js.map +1 -1
- django_agent_studio/static/django_agent_studio/js/style.css +1 -1
- django_agent_studio/templates/django_agent_studio/agent_list.html +31 -28
- django_agent_studio/templates/django_agent_studio/base.html +127 -27
- django_agent_studio/templates/django_agent_studio/builder.html +1 -1
- django_agent_studio/templates/django_agent_studio/collaborators.html +83 -95
- django_agent_studio/templates/django_agent_studio/home.html +66 -48
- django_agent_studio/templates/django_agent_studio/system_create.html +22 -24
- django_agent_studio/templates/django_agent_studio/system_list.html +38 -30
- django_agent_studio/templates/django_agent_studio/system_test.html +38 -24
- django_agent_studio/templates/django_agent_studio/test.html +32 -19
- django_agent_studio/urls.py +1 -0
- django_agent_studio/views.py +11 -0
- {django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/METADATA +2 -1
- {django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/RECORD +24 -23
- {django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/WHEEL +0 -0
- {django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/licenses/LICENSE +0 -0
- {django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/top_level.txt +0 -0
|
@@ -1,64 +1,64 @@
|
|
|
1
1
|
{% extends "django_agent_studio/base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}Create System -
|
|
3
|
+
{% block title %}Create System - {{ studio_app_name }}{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block breadcrumbs %}
|
|
6
6
|
<nav class="flex items-center space-x-2 ml-4 text-sm">
|
|
7
|
-
<span class="text-
|
|
8
|
-
<a href="{% url 'agent_studio:system_list' %}" class="text-
|
|
9
|
-
<span class="text-
|
|
10
|
-
<span class="text-
|
|
7
|
+
<span class="text-white/40">/</span>
|
|
8
|
+
<a href="{% url 'agent_studio:system_list' %}" class="text-white/60 hover:text-white/90 transition-colors">My Systems</a>
|
|
9
|
+
<span class="text-white/40">/</span>
|
|
10
|
+
<span class="text-white/70">Create</span>
|
|
11
11
|
</nav>
|
|
12
12
|
{% endblock %}
|
|
13
13
|
|
|
14
14
|
{% block content %}
|
|
15
|
-
<div class="h-full p-6 overflow-auto">
|
|
15
|
+
<div class="h-full p-6 overflow-auto bg-gradient-to-br from-slate-50 to-slate-100">
|
|
16
16
|
<div class="max-w-2xl mx-auto">
|
|
17
17
|
<!-- Header -->
|
|
18
18
|
<div class="mb-6">
|
|
19
|
-
<h1 class="text-2xl font-bold text-
|
|
20
|
-
<p class="text-
|
|
19
|
+
<h1 class="text-2xl font-bold text-navy">🔗 Create New System</h1>
|
|
20
|
+
<p class="text-slate-500 mt-1">A system combines multiple agents that work together.</p>
|
|
21
21
|
</div>
|
|
22
22
|
|
|
23
23
|
<!-- Form -->
|
|
24
|
-
<div class="bg-white border border-
|
|
24
|
+
<div class="bg-white border border-slate-200 rounded-xl p-6 shadow-sm">
|
|
25
25
|
<form @submit.prevent="createSystem" class="space-y-6">
|
|
26
26
|
<!-- Name -->
|
|
27
27
|
<div>
|
|
28
|
-
<label for="name" class="block text-sm font-medium text-
|
|
28
|
+
<label for="name" class="block text-sm font-medium text-navy mb-1">Name *</label>
|
|
29
29
|
<input type="text" id="name" v-model="form.name" @input="generateSlug"
|
|
30
|
-
class="w-full px-
|
|
30
|
+
class="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:ring-2 focus:ring-cyan/30 focus:border-cyan transition-all"
|
|
31
31
|
placeholder="My Agent System" required>
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
34
|
<!-- Slug -->
|
|
35
35
|
<div>
|
|
36
|
-
<label for="slug" class="block text-sm font-medium text-
|
|
36
|
+
<label for="slug" class="block text-sm font-medium text-navy mb-1">Slug *</label>
|
|
37
37
|
<input type="text" id="slug" v-model="form.slug"
|
|
38
|
-
class="w-full px-
|
|
38
|
+
class="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:ring-2 focus:ring-cyan/30 focus:border-cyan font-mono text-sm transition-all"
|
|
39
39
|
placeholder="my-agent-system" required>
|
|
40
|
-
<p class="text-xs text-
|
|
40
|
+
<p class="text-xs text-slate-400 mt-1">URL-friendly identifier (auto-generated from name)</p>
|
|
41
41
|
</div>
|
|
42
42
|
|
|
43
43
|
<!-- Description -->
|
|
44
44
|
<div>
|
|
45
|
-
<label for="description" class="block text-sm font-medium text-
|
|
45
|
+
<label for="description" class="block text-sm font-medium text-navy mb-1">Description</label>
|
|
46
46
|
<textarea id="description" v-model="form.description" rows="3"
|
|
47
|
-
class="w-full px-
|
|
47
|
+
class="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:ring-2 focus:ring-cyan/30 focus:border-cyan transition-all"
|
|
48
48
|
placeholder="Describe what this system does..."></textarea>
|
|
49
49
|
</div>
|
|
50
50
|
|
|
51
51
|
<!-- Entry Agent -->
|
|
52
52
|
<div>
|
|
53
|
-
<label for="entry_agent" class="block text-sm font-medium text-
|
|
53
|
+
<label for="entry_agent" class="block text-sm font-medium text-navy mb-1">Entry Agent</label>
|
|
54
54
|
<select id="entry_agent" v-model="form.entry_agent_id"
|
|
55
|
-
class="w-full px-
|
|
55
|
+
class="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:ring-2 focus:ring-cyan/30 focus:border-cyan transition-all">
|
|
56
56
|
<option value="">-- Select an agent --</option>
|
|
57
57
|
{% for agent in agents %}
|
|
58
58
|
<option value="{{ agent.id }}">{{ agent.icon|default:"🤖" }} {{ agent.name }}</option>
|
|
59
59
|
{% endfor %}
|
|
60
60
|
</select>
|
|
61
|
-
<p class="text-xs text-
|
|
61
|
+
<p class="text-xs text-slate-400 mt-1">The agent that handles incoming conversations. Sub-agents will be auto-discovered.</p>
|
|
62
62
|
</div>
|
|
63
63
|
|
|
64
64
|
<!-- Error Message -->
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
</div>
|
|
68
68
|
|
|
69
69
|
<!-- Actions -->
|
|
70
|
-
<div class="flex items-center justify-end space-x-3 pt-4 border-t border-
|
|
70
|
+
<div class="flex items-center justify-end space-x-3 pt-4 border-t border-slate-100">
|
|
71
71
|
<a href="{% url 'agent_studio:system_list' %}"
|
|
72
|
-
class="px-4 py-2 text-
|
|
72
|
+
class="px-4 py-2 text-slate-600 hover:text-navy transition-colors">Cancel</a>
|
|
73
73
|
<button type="submit" :disabled="loading"
|
|
74
|
-
class="px-6 py-2 bg-
|
|
74
|
+
class="px-6 py-2.5 bg-navy hover:bg-navy-light text-white rounded-xl font-medium disabled:opacity-50 transition-all hover:shadow-lg">
|
|
75
75
|
<span v-if="loading">Creating...</span>
|
|
76
76
|
<span v-else>Create System</span>
|
|
77
77
|
</button>
|
|
@@ -102,7 +102,6 @@ createApp({
|
|
|
102
102
|
},
|
|
103
103
|
methods: {
|
|
104
104
|
generateSlug() {
|
|
105
|
-
// Auto-generate slug from name
|
|
106
105
|
this.form.slug = this.form.name
|
|
107
106
|
.toLowerCase()
|
|
108
107
|
.replace(/[^a-z0-9]+/g, '-')
|
|
@@ -145,4 +144,3 @@ createApp({
|
|
|
145
144
|
}).use(primevue.config.default).mount('#app');
|
|
146
145
|
</script>
|
|
147
146
|
{% endblock %}
|
|
148
|
-
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
{% extends "django_agent_studio/base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}My Systems -
|
|
3
|
+
{% block title %}My Systems - {{ studio_app_name }}{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block breadcrumbs %}
|
|
6
6
|
<nav class="flex items-center space-x-2 ml-4 text-sm">
|
|
7
|
-
<span class="text-
|
|
8
|
-
<span class="text-
|
|
7
|
+
<span class="text-white/40">/</span>
|
|
8
|
+
<span class="text-white/70">My Systems</span>
|
|
9
9
|
</nav>
|
|
10
10
|
{% endblock %}
|
|
11
11
|
|
|
12
12
|
{% block content %}
|
|
13
|
-
<div class="h-full p-6 overflow-auto">
|
|
13
|
+
<div class="h-full p-6 overflow-auto bg-gradient-to-br from-slate-50 to-slate-100">
|
|
14
14
|
<div class="max-w-6xl mx-auto">
|
|
15
15
|
<!-- Header -->
|
|
16
16
|
<div class="flex items-center justify-between mb-6">
|
|
17
|
-
<h1 class="text-2xl font-bold text-
|
|
17
|
+
<h1 class="text-2xl font-bold text-navy">My Systems</h1>
|
|
18
18
|
<a href="{% url 'agent_studio:system_create' %}"
|
|
19
|
-
class="px-4 py-2
|
|
20
|
-
|
|
19
|
+
class="bg-navy hover:bg-navy-light text-white px-4 py-2 rounded-xl flex items-center space-x-2 transition-all hover:shadow-lg hover:-translate-y-0.5 font-medium">
|
|
20
|
+
<i class="pi pi-plus"></i>
|
|
21
|
+
<span>New System</span>
|
|
21
22
|
</a>
|
|
22
23
|
</div>
|
|
23
24
|
|
|
@@ -25,49 +26,54 @@
|
|
|
25
26
|
<!-- System Grid -->
|
|
26
27
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
27
28
|
{% for system in systems %}
|
|
28
|
-
<div class="bg-white border border-
|
|
29
|
-
<div class="p-
|
|
29
|
+
<div class="bg-white border border-slate-200 rounded-xl overflow-hidden hover:border-cyan hover:shadow-md transition-all group">
|
|
30
|
+
<div class="p-5">
|
|
30
31
|
<div class="flex items-center justify-between mb-3">
|
|
31
32
|
<div class="flex items-center space-x-3">
|
|
32
|
-
<
|
|
33
|
+
<div class="w-10 h-10 bg-navy/10 rounded-lg flex items-center justify-center group-hover:bg-cyan/20 transition-colors">
|
|
34
|
+
<span class="text-xl">🔗</span>
|
|
35
|
+
</div>
|
|
33
36
|
<div>
|
|
34
|
-
<h3 class="font-semibold text-
|
|
35
|
-
<span class="text-xs text-
|
|
37
|
+
<h3 class="font-semibold text-navy">{{ system.name }}</h3>
|
|
38
|
+
<span class="text-xs text-slate-400 font-mono">{{ system.slug }}</span>
|
|
36
39
|
</div>
|
|
37
40
|
</div>
|
|
38
41
|
<div class="flex items-center space-x-1">
|
|
39
42
|
{% if system.is_active %}
|
|
40
|
-
<span class="w-2 h-2 bg-
|
|
43
|
+
<span class="w-2 h-2 bg-cyan rounded-full" title="Active"></span>
|
|
41
44
|
{% else %}
|
|
42
|
-
<span class="w-2 h-2 bg-
|
|
45
|
+
<span class="w-2 h-2 bg-slate-300 rounded-full" title="Inactive"></span>
|
|
43
46
|
{% endif %}
|
|
44
47
|
</div>
|
|
45
48
|
</div>
|
|
46
|
-
<p class="text-sm text-
|
|
49
|
+
<p class="text-sm text-slate-500 line-clamp-2 mb-3">{{ system.description|default:"No description" }}</p>
|
|
47
50
|
|
|
48
51
|
<!-- Entry Agent Info -->
|
|
49
|
-
<div class="bg-
|
|
52
|
+
<div class="bg-slate-50 rounded-lg p-3 mb-3 border border-slate-100">
|
|
50
53
|
<div class="flex items-center space-x-2 text-sm">
|
|
51
|
-
<span class="text-
|
|
54
|
+
<span class="text-slate-400 text-xs font-medium uppercase tracking-wide">Entry</span>
|
|
52
55
|
<span class="text-lg">{{ system.entry_agent.icon|default:"🤖" }}</span>
|
|
53
|
-
<span class="text-
|
|
56
|
+
<span class="text-navy font-medium">{{ system.entry_agent.name }}</span>
|
|
54
57
|
</div>
|
|
55
58
|
</div>
|
|
56
59
|
|
|
57
60
|
<!-- Member Count -->
|
|
58
|
-
<div class="flex items-center justify-between text-xs text-
|
|
59
|
-
<span
|
|
61
|
+
<div class="flex items-center justify-between text-xs text-slate-400">
|
|
62
|
+
<span class="flex items-center gap-1">
|
|
63
|
+
<i class="pi pi-users text-xs"></i>
|
|
64
|
+
{{ system.members.count }} agent{{ system.members.count|pluralize }}
|
|
65
|
+
</span>
|
|
60
66
|
<span>Updated {{ system.updated_at|timesince }} ago</span>
|
|
61
67
|
</div>
|
|
62
68
|
</div>
|
|
63
|
-
<div class="border-t border-
|
|
69
|
+
<div class="border-t border-slate-100 px-5 py-3 bg-slate-50/50 flex items-center justify-between">
|
|
64
70
|
<a href="{% url 'agent_studio:system_collaborators' system.id %}"
|
|
65
|
-
class="text-
|
|
71
|
+
class="text-slate-400 hover:text-navy text-sm transition-colors"
|
|
66
72
|
title="Manage collaborators">
|
|
67
73
|
<i class="pi pi-users"></i>
|
|
68
74
|
</a>
|
|
69
75
|
<a href="{% url 'agent_studio:system_test' system.id %}"
|
|
70
|
-
class="text-
|
|
76
|
+
class="text-cyan hover:text-cyan-dark text-sm font-medium transition-colors">
|
|
71
77
|
Test System →
|
|
72
78
|
</a>
|
|
73
79
|
</div>
|
|
@@ -76,13 +82,16 @@
|
|
|
76
82
|
</div>
|
|
77
83
|
{% else %}
|
|
78
84
|
<!-- Empty State -->
|
|
79
|
-
<div class="text-center py-
|
|
80
|
-
<div class="
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
<div class="text-center py-16 bg-white rounded-xl border border-slate-200 border-dashed">
|
|
86
|
+
<div class="w-16 h-16 bg-navy/10 rounded-2xl flex items-center justify-center mx-auto mb-4">
|
|
87
|
+
<span class="text-4xl">🔗</span>
|
|
88
|
+
</div>
|
|
89
|
+
<h3 class="text-xl font-semibold text-navy mb-2">No systems yet</h3>
|
|
90
|
+
<p class="text-slate-500 mb-6">Systems are multi-agent configurations that work together.</p>
|
|
83
91
|
<a href="{% url 'agent_studio:system_create' %}"
|
|
84
|
-
class="
|
|
85
|
-
|
|
92
|
+
class="bg-navy hover:bg-navy-light text-white px-6 py-3 rounded-xl inline-flex items-center space-x-2 transition-all hover:shadow-lg font-medium">
|
|
93
|
+
<i class="pi pi-plus"></i>
|
|
94
|
+
<span>Create Your First System</span>
|
|
86
95
|
</a>
|
|
87
96
|
</div>
|
|
88
97
|
{% endif %}
|
|
@@ -101,4 +110,3 @@ createApp({
|
|
|
101
110
|
}).use(primevue.config.default).mount('#app');
|
|
102
111
|
</script>
|
|
103
112
|
{% endblock %}
|
|
104
|
-
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{% extends "django_agent_studio/base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}Test {{ system.name }} -
|
|
3
|
+
{% block title %}Test {{ system.name }} - {{ studio_app_name }}{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block breadcrumbs %}
|
|
6
6
|
<nav class="flex items-center space-x-2 ml-4 text-sm">
|
|
7
|
-
<span class="text-
|
|
8
|
-
<a href="{% url 'agent_studio:system_list' %}" class="text-
|
|
9
|
-
<span class="text-
|
|
10
|
-
<span class="text-
|
|
11
|
-
<span class="text-
|
|
12
|
-
<span class="text-
|
|
7
|
+
<span class="text-white/40">/</span>
|
|
8
|
+
<a href="{% url 'agent_studio:system_list' %}" class="text-white/60 hover:text-white/90 transition-colors">My Systems</a>
|
|
9
|
+
<span class="text-white/40">/</span>
|
|
10
|
+
<span class="text-white/70">{{ system.name }}</span>
|
|
11
|
+
<span class="text-white/40">/</span>
|
|
12
|
+
<span class="text-white/70">Test</span>
|
|
13
13
|
</nav>
|
|
14
14
|
{% endblock %}
|
|
15
15
|
|
|
@@ -19,20 +19,20 @@
|
|
|
19
19
|
display: flex;
|
|
20
20
|
justify-content: center;
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
#fullscreen-chat-container .cw-container {
|
|
24
24
|
position: relative !important;
|
|
25
25
|
width: 100% !important;
|
|
26
26
|
height: 100% !important;
|
|
27
27
|
max-height: none !important;
|
|
28
28
|
border-radius: 0 !important;
|
|
29
|
-
box-shadow: 0
|
|
29
|
+
box-shadow: 0 4px 20px rgba(0, 20, 46, 0.1) !important;
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
#fullscreen-chat-container .cw-toggle-btn {
|
|
33
33
|
display: none !important;
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
#fullscreen-chat-container .cw-widget {
|
|
37
37
|
position: relative !important;
|
|
38
38
|
width: 100% !important;
|
|
@@ -40,6 +40,18 @@
|
|
|
40
40
|
max-height: none !important;
|
|
41
41
|
border-radius: 0 !important;
|
|
42
42
|
display: flex !important;
|
|
43
|
+
flex-direction: column !important;
|
|
44
|
+
overflow: hidden !important;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#fullscreen-chat-container .cw-messages {
|
|
48
|
+
flex: 1 !important;
|
|
49
|
+
min-height: 0 !important;
|
|
50
|
+
overflow-y: auto !important;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#fullscreen-chat-container .cw-header {
|
|
54
|
+
background: {{ studio_colors.primary }} !important;
|
|
43
55
|
}
|
|
44
56
|
</style>
|
|
45
57
|
{% endblock %}
|
|
@@ -47,37 +59,41 @@
|
|
|
47
59
|
{% block content %}
|
|
48
60
|
<div class="h-full flex flex-col">
|
|
49
61
|
<!-- System Info Bar -->
|
|
50
|
-
<div class="px-
|
|
62
|
+
<div class="px-5 py-3 bg-white border-b border-slate-200 flex items-center justify-between">
|
|
51
63
|
<div class="flex items-center space-x-4">
|
|
52
|
-
<
|
|
64
|
+
<div class="w-10 h-10 bg-navy/10 rounded-lg flex items-center justify-center">
|
|
65
|
+
<span class="text-xl">🔗</span>
|
|
66
|
+
</div>
|
|
53
67
|
<div>
|
|
54
|
-
<h1 class="font-semibold text-
|
|
55
|
-
<p class="text-sm text-
|
|
56
|
-
|
|
57
|
-
|
|
68
|
+
<h1 class="font-semibold text-navy">{{ system.name }}</h1>
|
|
69
|
+
<p class="text-sm text-slate-500">
|
|
70
|
+
<span class="inline-flex items-center gap-1 bg-cyan/10 text-navy px-2 py-0.5 rounded-full text-xs font-medium">
|
|
71
|
+
{{ agent.icon|default:"🤖" }} {{ agent.name }}
|
|
72
|
+
</span>
|
|
73
|
+
<span class="text-slate-300 mx-2">•</span>
|
|
58
74
|
{{ system.description|default:"No description"|truncatechars:80 }}
|
|
59
75
|
</p>
|
|
60
76
|
</div>
|
|
61
77
|
</div>
|
|
62
78
|
<div class="flex items-center space-x-3">
|
|
63
79
|
<a href="{% url 'agent_studio:system_collaborators' system.id %}"
|
|
64
|
-
class="text-
|
|
80
|
+
class="text-slate-500 hover:text-navy px-3 py-1.5 border border-slate-200 rounded-lg text-sm transition-colors hover:border-cyan"
|
|
65
81
|
title="Manage collaborators">
|
|
66
82
|
<i class="pi pi-users"></i>
|
|
67
83
|
</a>
|
|
68
84
|
<a href="{% url 'agent_studio:system_list' %}"
|
|
69
|
-
class="text-
|
|
85
|
+
class="text-slate-500 hover:text-navy px-3 py-1.5 border border-slate-200 rounded-lg text-sm transition-colors hover:border-cyan">
|
|
70
86
|
← Back to Systems
|
|
71
87
|
</a>
|
|
72
88
|
<button @click="clearChat"
|
|
73
|
-
class="text-
|
|
89
|
+
class="text-white bg-navy hover:bg-navy-light px-4 py-1.5 rounded-lg text-sm font-medium transition-all hover:shadow-md">
|
|
74
90
|
Clear Chat
|
|
75
91
|
</button>
|
|
76
92
|
</div>
|
|
77
93
|
</div>
|
|
78
94
|
|
|
79
95
|
<!-- Full Screen Chat -->
|
|
80
|
-
<div class="flex-1 relative bg-
|
|
96
|
+
<div class="flex-1 min-h-0 relative bg-gradient-to-br from-slate-50 to-slate-100 flex justify-center">
|
|
81
97
|
<div id="fullscreen-chat-container" class="relative w-full max-w-[800px] h-full"></div>
|
|
82
98
|
</div>
|
|
83
99
|
</div>
|
|
@@ -87,7 +103,6 @@
|
|
|
87
103
|
<script>
|
|
88
104
|
const { createApp } = Vue;
|
|
89
105
|
|
|
90
|
-
// Use the entry agent's slug for the chat
|
|
91
106
|
const agentSlug = "{{ agent.slug|escapejs }}";
|
|
92
107
|
const backendUrl = window.location.origin;
|
|
93
108
|
|
|
@@ -101,7 +116,7 @@ function initChat() {
|
|
|
101
116
|
backendUrl: backendUrl,
|
|
102
117
|
agentKey: agentSlug,
|
|
103
118
|
title: '{{ system.name|escapejs }}',
|
|
104
|
-
primaryColor: '
|
|
119
|
+
primaryColor: '{{ studio_chat_primary_color }}',
|
|
105
120
|
showClearButton: true,
|
|
106
121
|
showDebugButton: true,
|
|
107
122
|
showExpandButton: false,
|
|
@@ -130,4 +145,3 @@ createApp({
|
|
|
130
145
|
}).use(primevue.config.default).mount('#app');
|
|
131
146
|
</script>
|
|
132
147
|
{% endblock %}
|
|
133
|
-
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{% extends "django_agent_studio/base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}Test {{ agent.name }} -
|
|
3
|
+
{% block title %}Test {{ agent.name }} - {{ studio_app_name }}{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block breadcrumbs %}
|
|
6
6
|
<nav class="flex items-center space-x-2 ml-4 text-sm">
|
|
7
|
-
<span class="text-
|
|
8
|
-
<a href="{% url 'agent_studio:agent_list' %}" class="text-
|
|
9
|
-
<span class="text-
|
|
10
|
-
<a href="{% url 'agent_studio:agent_edit' agent.id %}" class="text-
|
|
11
|
-
<span class="text-
|
|
12
|
-
<span class="text-
|
|
7
|
+
<span class="text-white/40">/</span>
|
|
8
|
+
<a href="{% url 'agent_studio:agent_list' %}" class="text-white/60 hover:text-white/90 transition-colors">My Agents</a>
|
|
9
|
+
<span class="text-white/40">/</span>
|
|
10
|
+
<a href="{% url 'agent_studio:agent_edit' agent.id %}" class="text-white/60 hover:text-white/90 transition-colors">{{ agent.name }}</a>
|
|
11
|
+
<span class="text-white/40">/</span>
|
|
12
|
+
<span class="text-white/70">Test</span>
|
|
13
13
|
</nav>
|
|
14
14
|
{% endblock %}
|
|
15
15
|
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
border-radius: 0 !important;
|
|
28
28
|
box-shadow: none !important;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
#fullscreen-chat-container .cw-toggle-btn {
|
|
32
32
|
display: none !important;
|
|
33
33
|
}
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
#fullscreen-chat-container .cw-widget {
|
|
36
36
|
position: absolute !important;
|
|
37
37
|
top: 0;
|
|
@@ -43,6 +43,18 @@
|
|
|
43
43
|
max-height: none !important;
|
|
44
44
|
border-radius: 0 !important;
|
|
45
45
|
display: flex !important;
|
|
46
|
+
flex-direction: column !important;
|
|
47
|
+
overflow: hidden !important;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#fullscreen-chat-container .cw-messages {
|
|
51
|
+
flex: 1 !important;
|
|
52
|
+
min-height: 0 !important;
|
|
53
|
+
overflow-y: auto !important;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#fullscreen-chat-container .cw-header {
|
|
57
|
+
background: {{ studio_colors.primary }} !important;
|
|
46
58
|
}
|
|
47
59
|
</style>
|
|
48
60
|
{% endblock %}
|
|
@@ -50,33 +62,35 @@
|
|
|
50
62
|
{% block content %}
|
|
51
63
|
<div class="h-full flex flex-col">
|
|
52
64
|
<!-- Agent Info Bar -->
|
|
53
|
-
<div class="px-
|
|
65
|
+
<div class="px-5 py-3 bg-white border-b border-slate-200 flex items-center justify-between">
|
|
54
66
|
<div class="flex items-center space-x-4">
|
|
55
|
-
<
|
|
67
|
+
<div class="w-10 h-10 bg-cyan/10 rounded-lg flex items-center justify-center">
|
|
68
|
+
<span class="text-xl">{{ agent.icon|default:"🤖" }}</span>
|
|
69
|
+
</div>
|
|
56
70
|
<div>
|
|
57
|
-
<h1 class="font-semibold text-
|
|
58
|
-
<p class="text-sm text-
|
|
71
|
+
<h1 class="font-semibold text-navy">{{ agent.name }}</h1>
|
|
72
|
+
<p class="text-sm text-slate-500">{{ agent.description|default:"No description"|truncatechars:100 }}</p>
|
|
59
73
|
</div>
|
|
60
74
|
</div>
|
|
61
75
|
<div class="flex items-center space-x-3">
|
|
62
76
|
<a href="{% url 'agent_studio:agent_collaborators' agent.id %}"
|
|
63
|
-
class="text-
|
|
77
|
+
class="text-slate-500 hover:text-navy px-3 py-1.5 border border-slate-200 rounded-lg text-sm transition-colors hover:border-cyan"
|
|
64
78
|
title="Manage collaborators">
|
|
65
79
|
<i class="pi pi-users"></i>
|
|
66
80
|
</a>
|
|
67
81
|
<a href="{% url 'agent_studio:agent_edit' agent.id %}"
|
|
68
|
-
class="text-
|
|
82
|
+
class="text-slate-500 hover:text-navy px-3 py-1.5 border border-slate-200 rounded-lg text-sm transition-colors hover:border-cyan">
|
|
69
83
|
← Back to Editor
|
|
70
84
|
</a>
|
|
71
85
|
<button @click="clearChat"
|
|
72
|
-
class="text-
|
|
86
|
+
class="text-white bg-navy hover:bg-navy-light px-4 py-1.5 rounded-lg text-sm font-medium transition-all hover:shadow-md">
|
|
73
87
|
Clear Chat
|
|
74
88
|
</button>
|
|
75
89
|
</div>
|
|
76
90
|
</div>
|
|
77
91
|
|
|
78
92
|
<!-- Full Screen Chat -->
|
|
79
|
-
<div class="flex-1 relative bg-
|
|
93
|
+
<div class="flex-1 min-h-0 relative bg-gradient-to-br from-slate-50 to-slate-100">
|
|
80
94
|
<div id="fullscreen-chat-container" class="absolute inset-0"></div>
|
|
81
95
|
</div>
|
|
82
96
|
</div>
|
|
@@ -99,7 +113,7 @@ function initChat() {
|
|
|
99
113
|
backendUrl: backendUrl,
|
|
100
114
|
agentKey: agentSlug,
|
|
101
115
|
title: '{{ agent.name|escapejs }}',
|
|
102
|
-
primaryColor: '
|
|
116
|
+
primaryColor: '{{ studio_chat_primary_color }}',
|
|
103
117
|
showClearButton: true,
|
|
104
118
|
showDebugButton: true,
|
|
105
119
|
showExpandButton: false,
|
|
@@ -128,4 +142,3 @@ createApp({
|
|
|
128
142
|
}).use(primevue.config.default).mount('#app');
|
|
129
143
|
</script>
|
|
130
144
|
{% endblock %}
|
|
131
|
-
|
django_agent_studio/urls.py
CHANGED
|
@@ -12,6 +12,7 @@ app_name = "agent_studio"
|
|
|
12
12
|
urlpatterns = [
|
|
13
13
|
# Main studio interface
|
|
14
14
|
path("", views.StudioHomeView.as_view(), name="home"),
|
|
15
|
+
path("logout/", views.LogoutView.as_view(), name="logout"),
|
|
15
16
|
|
|
16
17
|
# Systems (multi-agent systems)
|
|
17
18
|
path("systems/", views.SystemListView.as_view(), name="system_list"),
|
django_agent_studio/views.py
CHANGED
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
Views for django_agent_studio.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from django.contrib.auth import logout
|
|
5
6
|
from django.db.models import Q
|
|
7
|
+
from django.shortcuts import redirect
|
|
8
|
+
from django.views import View
|
|
6
9
|
from django.views.generic import TemplateView, ListView
|
|
7
10
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
8
11
|
|
|
@@ -452,3 +455,11 @@ class SystemCollaboratorsView(LoginRequiredMixin, SystemAccessMixin, TemplateVie
|
|
|
452
455
|
|
|
453
456
|
return context
|
|
454
457
|
|
|
458
|
+
|
|
459
|
+
class LogoutView(View):
|
|
460
|
+
"""Simple logout view that works with any auth backend."""
|
|
461
|
+
|
|
462
|
+
def post(self, request):
|
|
463
|
+
logout(request)
|
|
464
|
+
return redirect('/')
|
|
465
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-agent-studio
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: Visual agent builder and management studio for Django - build custom GPTs with a two-pane interface
|
|
5
5
|
Author: Chris Barry
|
|
6
6
|
License: Business Source License 1.1
|
|
@@ -126,6 +126,7 @@ A visual agent builder and management interface for Django applications. Create,
|
|
|
126
126
|
|
|
127
127
|
| Version | Date | Changes |
|
|
128
128
|
|---------|------|---------|
|
|
129
|
+
| **0.3.3** | 2026-01-30 | **Logout & Scroll Fixes** - Added logout button to header, fixed embedded chat widget scrolling with proper flex layout |
|
|
129
130
|
| **0.3.2** | 2026-01-30 | **Multi-User Access Control** - Collaborator management UI, user search autocomplete, supports both email and username-based User models, system creation from homepage, permission inheritance display |
|
|
130
131
|
| **0.3.1** | 2026-01-30 | **Bug Fixes** - Fixed duplicate message emit in dynamic agents, fixed escapejs encoding in templates, added 800px max-width constraint to system test view |
|
|
131
132
|
| **0.3.0** | 2026-01-29 | **System Listing & Navigation** - Browse and test multi-agent systems from homepage, fixed URL routing for My Systems/My Agents links, system creation now supports optional entry agent |
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
django_agent_studio/__init__.py,sha256=E2vGoil7ZmwTebaB5ap9Lt0ptAzqYB5xJpyi4bFbqL8,378
|
|
2
2
|
django_agent_studio/apps.py,sha256=L89QWn4XOvPBs2z6qHAhaE4uZQpasJntYD75aSd2p_k,607
|
|
3
|
-
django_agent_studio/
|
|
4
|
-
django_agent_studio/
|
|
3
|
+
django_agent_studio/branding.py,sha256=vg_TydsBeAPji6zz3rIeqq3I_RXvbXVJ4XDFmhner1k,3125
|
|
4
|
+
django_agent_studio/urls.py,sha256=qoqmIaYx2qB4Ail9AhOzH3XKrMK9T8wxk8Kms2sHbkk,1333
|
|
5
|
+
django_agent_studio/views.py,sha256=iAO_0oY3vlJdjaVACVXJN2Z784-Tc82PILXQqA2vHDk,15844
|
|
5
6
|
django_agent_studio/agents/__init__.py,sha256=VYL_ato0DtggIo4BGRkyiz9cm1ARPXhhTQFzoG__NVM,800
|
|
6
7
|
django_agent_studio/agents/builder.py,sha256=dRPQk5-AhUsTBOFxv8H4Uk2X2PfK631jjVJZ1w13GtM,146777
|
|
7
|
-
django_agent_studio/agents/dynamic.py,sha256=
|
|
8
|
+
django_agent_studio/agents/dynamic.py,sha256=Fe3qvPm1zwI-1a6B6t4QAcBAy2xkXwquyoeNjWDutsA,31185
|
|
8
9
|
django_agent_studio/api/__init__.py,sha256=vtBwuvBENyFFhFqCWyFsI6cYu4N9ZGqSMmHIRhr9a_U,45
|
|
9
10
|
django_agent_studio/api/permissions.py,sha256=MutmA8TxZb4ZwGfeEoolK-QI04Gbcxs7DPNzkXe_Bss,5302
|
|
10
|
-
django_agent_studio/api/serializers.py,sha256=
|
|
11
|
+
django_agent_studio/api/serializers.py,sha256=TT3-o_ZcGMSLKeQrExg3hl-I1T127uW6rMcKfPIaQzA,24079
|
|
11
12
|
django_agent_studio/api/urls.py,sha256=xfL3AbTP0GKRYarDExvUoXuz0txhgNCumgjVehSfmTY,9893
|
|
12
13
|
django_agent_studio/api/views.py,sha256=fECFWpu08ibQpOR-sL7AVCoTh4Ox6cYUEm4lh5GAPsE,90869
|
|
13
14
|
django_agent_studio/management/__init__.py,sha256=6O9RHMN_xMDrEzKWytpai6QqgTXZVqwRg4h9mIQWtA8,52
|
|
@@ -19,22 +20,22 @@ django_agent_studio/models/permissions.py,sha256=NepltvQzeehv5EwcOTqULj8n3N5XGVT
|
|
|
19
20
|
django_agent_studio/services/__init__.py,sha256=06cc1eLnAbROTKFxBgvkeCpsYV5cQsyJVGXaE_rcp3M,244
|
|
20
21
|
django_agent_studio/services/permissions.py,sha256=-cwe0YZCFBFYh_ScXKncsPwEkCfEyIrtOzp8Wt9GSco,7785
|
|
21
22
|
django_agent_studio/static/agent-frontend/chat-widget-markdown.js,sha256=_TQCux4HPRynCiLKydITO-docIRoi454jLpX0fegAFM,3722
|
|
22
|
-
django_agent_studio/static/agent-frontend/chat-widget.css,sha256=
|
|
23
|
-
django_agent_studio/static/agent-frontend/chat-widget.js,sha256=
|
|
24
|
-
django_agent_studio/static/django_agent_studio/js/builder.js,sha256=
|
|
25
|
-
django_agent_studio/static/django_agent_studio/js/builder.js.map,sha256=
|
|
26
|
-
django_agent_studio/static/django_agent_studio/js/style.css,sha256=
|
|
27
|
-
django_agent_studio/templates/django_agent_studio/agent_list.html,sha256=
|
|
28
|
-
django_agent_studio/templates/django_agent_studio/base.html,sha256=
|
|
29
|
-
django_agent_studio/templates/django_agent_studio/builder.html,sha256=
|
|
30
|
-
django_agent_studio/templates/django_agent_studio/collaborators.html,sha256=
|
|
31
|
-
django_agent_studio/templates/django_agent_studio/home.html,sha256=
|
|
32
|
-
django_agent_studio/templates/django_agent_studio/system_create.html,sha256=
|
|
33
|
-
django_agent_studio/templates/django_agent_studio/system_list.html,sha256=
|
|
34
|
-
django_agent_studio/templates/django_agent_studio/system_test.html,sha256=
|
|
35
|
-
django_agent_studio/templates/django_agent_studio/test.html,sha256=
|
|
36
|
-
django_agent_studio-0.3.
|
|
37
|
-
django_agent_studio-0.3.
|
|
38
|
-
django_agent_studio-0.3.
|
|
39
|
-
django_agent_studio-0.3.
|
|
40
|
-
django_agent_studio-0.3.
|
|
23
|
+
django_agent_studio/static/agent-frontend/chat-widget.css,sha256=hXbF85O9r9NtfGPsfm_j0ydA6eSQunxrSop3wguRQy4,39272
|
|
24
|
+
django_agent_studio/static/agent-frontend/chat-widget.js,sha256=taWJEanfXJjO9HRT3e1eK0428q3g-59s0PN9XsPjYIA,62278
|
|
25
|
+
django_agent_studio/static/django_agent_studio/js/builder.js,sha256=9b5tfVtKLBubzYx1SgfQ_k3DXyGk_hgTsD9CSOXH82M,419987
|
|
26
|
+
django_agent_studio/static/django_agent_studio/js/builder.js.map,sha256=GnCYDH_KCn9sK5ZY_qO7xZrHlK75kDYDagJChrFduy0,1650733
|
|
27
|
+
django_agent_studio/static/django_agent_studio/js/style.css,sha256=UqHhQqLup8c34l76M5YPQczAZs3FM4Z45-x-KbqVoZ8,1630851
|
|
28
|
+
django_agent_studio/templates/django_agent_studio/agent_list.html,sha256=khHjecmMkoUngSQISiFq8uVB7qj0W0loSr4KquggSo0,5475
|
|
29
|
+
django_agent_studio/templates/django_agent_studio/base.html,sha256=fMg6q7_3WmTRo4LOxWzYXXnpgorEaPbTeaZlJXQjD1o,10022
|
|
30
|
+
django_agent_studio/templates/django_agent_studio/builder.html,sha256=sc0V661vbe6iOULqsMOgX6fqgDNtyYRx1NobmqX79Us,1551
|
|
31
|
+
django_agent_studio/templates/django_agent_studio/collaborators.html,sha256=9r9uN9NdX_DijWdNUsDnIyGCvYdB25GUCyXkqxPDWI0,19641
|
|
32
|
+
django_agent_studio/templates/django_agent_studio/home.html,sha256=4TSpgQg5fS5qGZHSeuYLF6xs8JoJr0dnEd2DUjHxHE0,8720
|
|
33
|
+
django_agent_studio/templates/django_agent_studio/system_create.html,sha256=0D46_4fxcXYeGicoRVycKHgDWBbOnsrG8N2_wYaXaLA,6492
|
|
34
|
+
django_agent_studio/templates/django_agent_studio/system_list.html,sha256=93gQUcUbgWhPXdo8gyLTdqlceDmII5nOe9wjgW9v1WM,5555
|
|
35
|
+
django_agent_studio/templates/django_agent_studio/system_test.html,sha256=LJvJqqkdO4ua1GvWUV7M1G-NFhRjBy0eRsTKYY1rJkg,4990
|
|
36
|
+
django_agent_studio/templates/django_agent_studio/test.html,sha256=T0ETvqH5v7rUoOhuwbuxdZ2zrka89H4i-efNkwK_2Fc,4740
|
|
37
|
+
django_agent_studio-0.3.4.dist-info/licenses/LICENSE,sha256=WIh21lpD7d7xCUtLysKK-kbfW4SG7GNPf_k7_Xm_sZg,3851
|
|
38
|
+
django_agent_studio-0.3.4.dist-info/METADATA,sha256=1OiOos9Wxx_L-UxHIys4b-reu_hQ4CB1_p95-5hi1Lw,17048
|
|
39
|
+
django_agent_studio-0.3.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
40
|
+
django_agent_studio-0.3.4.dist-info/top_level.txt,sha256=O1kqZzXPOsJlqnPSAcB2fH5WpJNY8ZNfHEJzX9_SZ0A,20
|
|
41
|
+
django_agent_studio-0.3.4.dist-info/RECORD,,
|
|
File without changes
|
{django_agent_studio-0.3.2.dist-info → django_agent_studio-0.3.4.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|