feat: first-meeting gate on drawer Add-guest form (T72.2)
When a host->candidate edge already exists from a prior chat, the Add-guest form renders the prose textarea disabled with an "already know each other" note. Submission without the explicit "re-seed anyway" toggle skips seed_inter_bot_edges so existing edge content (affinity, trust, knowledge, summaries) survives — guest_added and group_node_initialized still fire. A small inline script enables / disables the textarea per-option based on a pre-computed existing_guest_edges dict surfaced by the GET handler.
This commit is contained in:
@@ -100,24 +100,71 @@
|
||||
<section class="drawer-section">
|
||||
<h3>Add guest</h3>
|
||||
{% if available_guests %}
|
||||
<form class="inline-edit"
|
||||
{% set first_guest_id = available_guests[0].id %}
|
||||
{% set first_existing = existing_guest_edges.get(first_guest_id, False) %}
|
||||
<form class="inline-edit add-guest-form"
|
||||
hx-post="/chats/{{ chat.id }}/drawer/guest/add"
|
||||
hx-target="#drawer" hx-swap="innerHTML">
|
||||
<label>
|
||||
Bot:
|
||||
<select name="guest_bot_id" required>
|
||||
<select name="guest_bot_id" required class="add-guest-select">
|
||||
{% for b in available_guests %}
|
||||
<option value="{{ b.id }}">{{ b.name }}</option>
|
||||
<option value="{{ b.id }}"
|
||||
data-existing-edge="{{ 'true' if existing_guest_edges.get(b.id) else 'false' }}">
|
||||
{{ b.name }}{% if existing_guest_edges.get(b.id) %} (already met){% endif %}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</label>
|
||||
<p class="muted add-guest-existing-note"
|
||||
{% if not first_existing %}hidden{% endif %}>
|
||||
they already know each other (edge exists from a prior chat)
|
||||
</p>
|
||||
<label class="add-guest-reseed-label"
|
||||
{% if not first_existing %}hidden{% endif %}>
|
||||
<input type="checkbox" name="reseed" value="1" class="add-guest-reseed">
|
||||
re-seed anyway
|
||||
</label>
|
||||
<label>
|
||||
Have they met before? Describe how (leave blank if not):
|
||||
<textarea name="relationship_prose" rows="3"
|
||||
class="add-guest-prose"
|
||||
{% if first_existing %}disabled{% endif %}
|
||||
placeholder="e.g. Old college friends who studied physics together."></textarea>
|
||||
</label>
|
||||
<button type="submit">Add guest</button>
|
||||
</form>
|
||||
<script>
|
||||
(function () {
|
||||
var form = document.currentScript.previousElementSibling;
|
||||
while (form && !form.classList.contains('add-guest-form')) {
|
||||
form = form.previousElementSibling;
|
||||
}
|
||||
if (!form) return;
|
||||
var sel = form.querySelector('.add-guest-select');
|
||||
var prose = form.querySelector('.add-guest-prose');
|
||||
var reseed = form.querySelector('.add-guest-reseed');
|
||||
var note = form.querySelector('.add-guest-existing-note');
|
||||
var reseedLabel = form.querySelector('.add-guest-reseed-label');
|
||||
function refresh() {
|
||||
var opt = sel.options[sel.selectedIndex];
|
||||
var existing = opt && opt.getAttribute('data-existing-edge') === 'true';
|
||||
if (existing) {
|
||||
note.removeAttribute('hidden');
|
||||
reseedLabel.removeAttribute('hidden');
|
||||
prose.disabled = !reseed.checked;
|
||||
} else {
|
||||
note.setAttribute('hidden', '');
|
||||
reseedLabel.setAttribute('hidden', '');
|
||||
reseed.checked = false;
|
||||
prose.disabled = false;
|
||||
}
|
||||
}
|
||||
sel.addEventListener('change', refresh);
|
||||
reseed.addEventListener('change', refresh);
|
||||
refresh();
|
||||
})();
|
||||
</script>
|
||||
{% else %}
|
||||
<p class="muted">No other bots authored yet.</p>
|
||||
{% endif %}
|
||||
|
||||
Reference in New Issue
Block a user