Skip to content

Commit 1319d1f

Browse files
author
Jicheng Lu
committed
add editable channel prompts
1 parent df80456 commit 1319d1f

File tree

6 files changed

+210
-46
lines changed

6 files changed

+210
-46
lines changed

src/lib/common/InPlaceEdit.svelte

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,73 @@
11
<script>
2-
import { createEventDispatcher, onMount } from 'svelte'
2+
import { createEventDispatcher, onMount } from 'svelte';
33
4-
export let value, required = true
4+
/** @type {string} */
5+
export let value = '';
6+
7+
/** @type {boolean} */
8+
export let required = true;
9+
10+
/** @type {number} */
11+
export let maxLength = 30;
12+
13+
/** @type {string} */
14+
export let placeholder = 'Please edit here...';
515
6-
const dispatch = createEventDispatcher()
7-
let editing = false, original
16+
const dispatch = createEventDispatcher();
17+
let editing = false;
18+
let original = '';
819
920
onMount(() => {
10-
original = value
21+
original = value;
1122
})
1223
1324
function edit() {
14-
editing = true
25+
editing = true;
1526
}
1627
1728
function submit() {
18-
if (value != original) {
19-
dispatch('submit', value)
20-
}
29+
if (value != original) {
30+
dispatch('submit', value);
31+
}
2132
22-
editing = false
33+
editing = false;
2334
}
2435
36+
/** @param {any} event */
2537
function keydown(event) {
26-
if (event.key == 'Escape') {
27-
event.preventDefault()
28-
value = original
29-
editing = false
30-
}
38+
if (event.key == 'Escape') {
39+
event.preventDefault()
40+
value = original;
41+
editing = false
42+
}
3143
}
3244
45+
/** @param {HTMLInputElement} element */
3346
function focus(element) {
34-
element.focus()
47+
element.focus();
3548
}
3649
</script>
3750

3851
{#if editing}
39-
<form on:submit|preventDefault={submit} on:keydown={keydown}>
40-
<input class="form-control" bind:value on:blur={submit} {required} use:focus/>
41-
</form>
52+
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
53+
<form on:submit|preventDefault={() => submit()} on:keydown={e => keydown(e)}>
54+
<input
55+
class="form-control"
56+
bind:value={value}
57+
{required}
58+
maxlength={maxLength}
59+
use:focus
60+
on:blur={() => submit()}
61+
/>
62+
</form>
4263
{:else}
43-
<div on:click={edit}>
44-
{value}
45-
</div>
64+
<!-- svelte-ignore a11y-click-events-have-key-events -->
65+
<!-- svelte-ignore a11y-no-static-element-interactions -->
66+
<div style="width: fit-content; min-width: 30%;" on:click={() => edit()}>
67+
{#if !!value?.trim()}
68+
<span>{value}</span>
69+
{:else}
70+
<span class="text-secondary fw-light">{placeholder}</span>
71+
{/if}
72+
</div>
4673
{/if}

src/lib/common/nav-bar/NavItem.svelte

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script>
2+
import InPlaceEdit from "../InPlaceEdit.svelte";
3+
24
35
/** @type {string} */
46
export let containerClasses = "";
@@ -39,6 +41,18 @@
3941
/** @type {boolean} */
4042
export let disabled = false;
4143
44+
/** @type {boolean} */
45+
export let allowEdit = false;
46+
47+
/** @type {number} */
48+
export let maxEditLength = 30;
49+
50+
/** @type {string} */
51+
export let editPlaceholder = "Please edit here...";
52+
53+
/** @type {boolean} */
54+
export let allowDelete = false;
55+
4256
/** @type {string} */
4357
export let dataBsToggle = "tab";
4458
@@ -51,16 +65,25 @@
5165
/** @type {() => void} */
5266
export let onClick = () => {};
5367
68+
/** @type {() => void} */
69+
export let onDelete = () => {};
70+
5471
/** @param {any} e */
5572
function handleTabClick(e) {
5673
e.preventDefault();
5774
onClick?.();
5875
}
76+
77+
/** @param {any} e */
78+
function handleTabDelete(e) {
79+
e.preventDefault();
80+
onDelete?.();
81+
}
5982
</script>
6083
6184
<li
6285
class="{disableDefaultContainerStyles ? '' : 'nav-item tab-item'} {containerClasses}"
63-
style={`${containerStyles}`}
86+
style={`${allowDelete ? 'display: flex;' : ''} ${containerStyles}`}
6487
id={containerId}
6588
role={containerRole}
6689
>
@@ -78,8 +101,27 @@
78101
disabled={disabled}
79102
on:click={(e) => handleTabClick(e)}
80103
>
81-
{navBtnText}
104+
{#if allowEdit}
105+
<InPlaceEdit bind:value={navBtnText} maxLength={maxEditLength} placeholder={editPlaceholder} />
106+
{:else}
107+
<div style="height: 100%" class="line-align-center">
108+
<div>{navBtnText}</div>
109+
</div>
110+
{/if}
82111
</button>
112+
113+
{#if allowDelete}
114+
<slot name="delete-icon">
115+
<!-- svelte-ignore a11y-click-events-have-key-events -->
116+
<!-- svelte-ignore a11y-no-static-element-interactions -->
117+
<div class="line-align-center">
118+
<i
119+
class="mdi mdi-minus-circle text-danger clickable"
120+
on:click={e => handleTabDelete(e)}
121+
/>
122+
</div>
123+
</slot>
124+
{/if}
83125
</li>
84126
85127
<style>
@@ -93,6 +135,8 @@
93135
border: none !important;
94136
color: white;
95137
font-weight: 500;
138+
display: inline-flex;
139+
justify-content: center;
96140
}
97141
98142
.tab-btn.active {

src/lib/helpers/types/agentTypes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090

9191
/**
9292
* @typedef {Object} ChannelInstruction
93+
* @property {string} [uid]
9394
* @property {string} channel
9495
* @property {string} instruction
9596
*/

src/routes/page/agent/[agentId]/+page.svelte

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
let agent;
2525
/** @type {any} */
2626
let agentFunctionCmp = null;
27+
/** @type {any} */
28+
let agentPromptCmp = null;
2729
2830
/** @type {boolean} */
2931
let isLoading = false;
@@ -62,7 +64,8 @@
6264
6365
function handleAgentUpdate() {
6466
fetchJsonContent();
65-
isLoading = true;
67+
fetchPrompts();
68+
6669
agent = {
6770
...agent,
6871
description: agent.description || '',
@@ -71,9 +74,11 @@
7174
profiles: agent.profiles?.filter((x, idx, self) => x?.trim()?.length > 0 && self.indexOf(x) === idx) || [],
7275
utilities: agent.utilities?.filter((x, idx, self) => x?.trim()?.length > 0 && self.indexOf(x) === idx) || []
7376
};
77+
isLoading = true;
7478
saveAgent(agent).then(res => {
7579
isLoading = false;
7680
isComplete = true;
81+
refreshChannelPrompts();
7782
setTimeout(() => {
7883
isComplete = false;
7984
}, duration);
@@ -99,6 +104,16 @@
99104
(jsonContent?.templates?.length > 0 ? jsonContent?.templates : []);
100105
}
101106
107+
function fetchPrompts() {
108+
const obj = agentPromptCmp?.fetchChannelPrompts();
109+
agent.instruction = obj.systemPrompt;
110+
agent.channel_instructions = obj.channelPrompts || [];
111+
}
112+
113+
function refreshChannelPrompts() {
114+
agentPromptCmp?.refreshChannelPrompts();
115+
}
116+
102117
function deleteCurrentAgent() {
103118
Swal.fire({
104119
title: 'Are you sure?',
@@ -141,7 +156,7 @@
141156
</Col>
142157
<Col class="section-min-width" style="flex: 65%;">
143158
<div class="agent-detail-section">
144-
<AgentPrompt agent={agent} />
159+
<AgentPrompt bind:this={agentPromptCmp} agent={agent} />
145160
</div>
146161
<div class="agent-detail-section">
147162
<AgentFunction bind:this={agentFunctionCmp} agent={agent} />

src/routes/page/agent/[agentId]/agent-overview.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
<span><i class="mdi mdi-chat" /></span>
8484
</Button>
8585
</div>
86-
<h5 class="mt-1 mb-1"><InPlaceEdit bind:value={agent.name}/></h5>
86+
<h5 class="mt-1 mb-1"><InPlaceEdit bind:value={agent.name} /></h5>
8787
<p class="text-muted mb-0">Updated at {format(agent.updated_datetime, 'time')}</p>
8888
</div>
8989
</CardHeader>

0 commit comments

Comments
 (0)