A tidier button for asking an agent: its mark, then Ask or Draft with its name 3ea0b8af2d46
- Author
- Andy McCall @andymccall <[email protected]>
- When
- · 2026-10-04 18:08 UTC
- Signature
- ✔ signed by Andy McCall
- Hash
3ea0b8af2d46f938f1820637074bc691f9fb8cc7321191bda9fd192fe806162b- Depends on
- 206c1fc1b06a 7d2eb590051f 8e96499f2705 991b55638aaf d23464c0ac60 de505df5cf8d
- Depended on by
- 119fd17d213f ffb67a81188c 155cab142b63 e1dc108bd814
- In bookmarks
- api-unknown-fields cancel-landed-runs clear-waiting close-proposal-140 diffusion-pin-bookmark draft-ready image-check job-waits main oh-comment-body-file proposal-list-fast run-one-job wiki-says-so
- In tags
- v0.4.1 v0.4.2 v0.5.0 v0.5.1 v0.5.2 v0.6.0 v0.6.1 v0.7.0 v0.8.0 v0.9.0 v0.9.1 v0.9.11 v0.9.15 v0.9.16 v0.9.19 v0.9.2 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24 v0.9.3 v0.9.4 v0.9.5 v0.9.6 v0.9.7 v0.9.8 v0.9.9
- Edits
- 6 atoms, 0 tree operations, 3 files
Browse the tree at this change
modified templates/proposal.html +2 −2
| … | 92 unchanged lines |
||
| 93 | 93 | <div class="edit-row"><label for="etarget">Into bookmark</label><input type="text" id="etarget" name="target" value="{{ p.target }}"></div> |
|
| 94 | 94 | <textarea id="ebody" name="body" class="md" rows="10" aria-label="Description (Markdown)">{% if let Some(d) = draft %}{{ d }}{% else %}{{ p.body }}{% endif %}</textarea> |
|
| 95 | 95 | {% if draft.is_some() %}<p class="small mute">Drafted by an assistant; nothing is saved until you update the proposal.</p>{% endif %} |
|
| 96 | - | <div class="tl-actions"><a class="go" href="#description">Cancel</a> {% for a in assistants %}<button type="submit" class="small" formaction="{{ repo.url }}/proposal/{{ p.number }}/draft" formnovalidate name="assistant" value="{{ a }}" title="{{ a }}, an AI assistant, drafts the description from the changes; you edit it before saving"><span class="tag">agent</span> draft with {{ a }}</button> {% endfor %}<button type="submit" class="primary-btn">Update proposal</button></div> |
|
| 96 | + | <div class="tl-actions"><a class="go" href="#description">Cancel</a> {% for a in assistants %}<button type="submit" class="agent-btn" formaction="{{ repo.url }}/proposal/{{ p.number }}/draft" formnovalidate name="assistant" value="{{ a }}" title="{{ a }}, an AI assistant, drafts the description from the changes; you edit it before saving"><img src="/avatar/agent/{{ a }}" alt="" width="16" height="16"> Draft with {{ a }}</button> {% endfor %}<button type="submit" class="primary-btn">Update proposal</button></div> |
|
| 97 | 97 | </form> |
|
| 98 | 98 | {% endif %} |
|
| 99 | 99 | </div> |
|
| … | 104 unchanged lines |
||
| 204 | 204 | <div class="menu-foot"><button type="submit" class="small primary-btn">Apply</button></div> |
|
| 205 | 205 | </form></details>{% endif %}</div> |
|
| 206 | 206 | {% if requested.is_empty() %}<p class="side-empty">No reviews requested</p>{% else %}<ul class="side-people">{% for r in requested %}<li><a href="/{{ r }}"><img class="avatar xs" src="/avatar/{{ r }}" alt="" loading="lazy"> {{ r }}</a> <span class="side-note-inline">awaiting review</span></li>{% endfor %}</ul>{% endif %} |
|
| 207 | - | {% if !assistants.is_empty() %}<div class="side-assist">{% for a in assistants %}<form class="tiny inline" method="post" action="{{ repo.url }}/proposal/{{ p.number }}/assistant"><input type="hidden" name="_csrf" value="{{ shell.csrf }}"><input type="hidden" name="assistant" value="{{ a }}"><button type="submit" title="Ask {{ a }}, an AI assistant, to review; its answer is recorded as your review via {{ a }}"><img class="avatar xs" src="/avatar/agent/{{ a }}" alt="" width="14" height="14"> ask {{ a }}</button></form>{% endfor %}</div>{% endif %} |
|
| 207 | + | {% if !assistants.is_empty() %}<div class="side-assist">{% for a in assistants %}<form class="tiny inline" method="post" action="{{ repo.url }}/proposal/{{ p.number }}/assistant"><input type="hidden" name="_csrf" value="{{ shell.csrf }}"><input type="hidden" name="assistant" value="{{ a }}"><button type="submit" class="agent-btn" title="Ask {{ a }}, an AI assistant, to review; its answer is recorded as your review via {{ a }}"><img src="/avatar/agent/{{ a }}" alt="" width="16" height="16"> Ask {{ a }}</button></form>{% endfor %}</div>{% endif %} |
|
| 208 | 208 | </section> |
|
| 209 | 209 | <section class="side-sec"> |
|
| 210 | 210 | <div class="side-head"><h3>Labels</h3> |
|
| … | 40 unchanged lines |
modified templates/proposal_new.html +1 −1
| … | 24 unchanged lines |
||
| 25 | 25 | <input type="hidden" name="target" value="{{ target }}"> |
|
| 26 | 26 | <label for="title">Title</label><input type="text" id="title" name="title" required value="{% if !title.is_empty() %}{{ title }}{% else if preview.len() == 1 %}{{ preview[0].title }}{% endif %}"> |
|
| 27 | 27 | <label for="body">Description (Markdown)</label><textarea id="body" name="body" class="md" rows="8">{{ body }}</textarea> |
|
| 28 | - | {% if !assistants.is_empty() %}<div class="side-assist">{% for a in assistants %}<button type="submit" class="small" formaction="{{ repo.url }}/proposals/new/draft" formnovalidate name="assistant" value="{{ a }}" title="{{ a }}, an AI assistant, drafts the description from the changes; you edit it before opening"><span class="tag">agent</span> draft with {{ a }}</button>{% endfor %}</div>{% endif %} |
|
| 28 | + | {% if !assistants.is_empty() %}<div class="side-assist">{% for a in assistants %}<button type="submit" class="agent-btn" formaction="{{ repo.url }}/proposals/new/draft" formnovalidate name="assistant" value="{{ a }}" title="{{ a }}, an AI assistant, drafts the description from the changes; you edit it before opening"><img src="/avatar/agent/{{ a }}" alt="" width="16" height="16"> Draft with {{ a }}</button>{% endfor %}</div>{% endif %} |
|
| 29 | 29 | <div class="choice"><label><input type="checkbox" name="draft" value="1"> draft: not ready for review</label></div> |
|
| 30 | 30 | <button type="submit">OPEN PROPOSAL</button> |
|
| 31 | 31 | </form> |
|
| … | 4 unchanged lines |
modified templates/style.css +4 −0
| … | 729 unchanged lines |
||
| 730 | 730 | .side-list form.inline { margin-left: 6px; } |
|
| 731 | 731 | .side-assist { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } |
|
| 732 | 732 | .side-assist form.inline { display: inline; margin: 0; } |
|
| 733 | + | /* A button that asks an AI agent: its mark, then the verb and its name. */ |
|
| 734 | + | button.agent-btn { display: inline-flex; align-items: center; gap: 7px; padding: 4px 10px 4px 6px; font-size: 11px; line-height: 16px; } |
|
| 735 | + | button.agent-btn img { width: 16px; height: 16px; border-radius: 50%; flex: 0 0 16px; } |
|
| 736 | + | button.agent-btn:hover img { filter: brightness(1.1); } |
|
| 733 | 737 | /* Forms inside a settings panel fill it, and a form that follows a table |
|
| 734 | 738 | (Add a runner) stands off it (oxygenhub#99). */ |
|
| 735 | 739 | .panel form.card { max-width: none; } |
|
| … | 66 unchanged lines |