|
@@ -5,17 +5,25 @@
|
|
|
<pstm-template>main</pstm-template>
|
|
<pstm-template>main</pstm-template>
|
|
|
<script>
|
|
<script>
|
|
|
// The goal page: supervision surface of one goal — status head
|
|
// The goal page: supervision surface of one goal — status head
|
|
|
- // with lifecycle actions, branch/push-state chips, the agent's
|
|
|
|
|
- // live progress feed and current activity, the locked brief, the
|
|
|
|
|
- // approved plan (revision history behind the expander), the
|
|
|
|
|
- // task status strip (its buttons filter the task list), the
|
|
|
|
|
- // supervision narrative, the comment thread with
|
|
|
|
|
- // selection-quoting, the completion review and the goal agent's
|
|
|
|
|
- // runs. Every long-form body (brief, plans, reports, blocks,
|
|
|
|
|
- // comments, events) renders as markdown via stm-markdown. The
|
|
|
|
|
- // status strip's filter lives client-side in
|
|
|
|
|
- // window.goalTaskFilter; clicking a strip button re-runs the
|
|
|
|
|
- // sealed refresh action, and the filter rides the re-render.
|
|
|
|
|
|
|
+ // with lifecycle actions (plus run-control parity: retry
|
|
|
|
|
+ // supervision, requeue-to-resume), branch/push-state chips, the
|
|
|
|
|
+ // agent's live progress feed and current activity, the ATTENTION
|
|
|
|
|
+ // blocks (the goal agent's answerable questions/RFCs and the
|
|
|
|
|
+ // completion review), the task status strip with per-row
|
|
|
|
|
+ // capability badges, the locked brief, the goal's effective
|
|
|
|
|
+ // rules, the approved plan (revision history behind the
|
|
|
|
|
+ // expander), the supervision narrative (events at full weight,
|
|
|
|
|
+ // comment events as footnotes), the comment thread with
|
|
|
|
|
+ // selection-quoting, and the goal agent's runs. Every long-form
|
|
|
|
|
+ // body (brief, plans, reports, blocks, comments, events) renders
|
|
|
|
|
+ // as markdown via stm-markdown. The plan review collects REMARKS
|
|
|
|
|
+ // (plan 14 B2): "Add remark" appends to a per-block queue that
|
|
|
|
|
+ // renders at the bottom of the plan, persists across pulse
|
|
|
|
|
+ // refreshes (the maps live outside statum re-renders), rides the
|
|
|
|
|
+ // rejection numbered, and clears on accept. The status strip's
|
|
|
|
|
+ // filter lives client-side in window.goalTaskFilter; clicking a
|
|
|
|
|
+ // strip button re-runs the sealed refresh action, and the filter
|
|
|
|
|
+ // rides the re-render.
|
|
|
if (window.statum) {
|
|
if (window.statum) {
|
|
|
(function () {
|
|
(function () {
|
|
|
'use strict';
|
|
'use strict';
|
|
@@ -277,9 +285,15 @@
|
|
|
<p stm-if="!goal.exists" class="muted">Goal not found.</p>
|
|
<p stm-if="!goal.exists" class="muted">Goal not found.</p>
|
|
|
|
|
|
|
|
<div stm-if="goal.exists">
|
|
<div stm-if="goal.exists">
|
|
|
- <!-- Status head: lifecycle badge, branch pair with the
|
|
|
|
|
- daemon-reported push-state chips, priority, the
|
|
|
|
|
- assigned agent saddle and the lifecycle actions. -->
|
|
|
|
|
|
|
+ <!-- Status head (first, always): lifecycle badge, branch
|
|
|
|
|
+ pair with the daemon-reported push-state chips,
|
|
|
|
|
+ priority, timestamps, the assigned/parking agent
|
|
|
|
|
+ saddle and the lifecycle actions — with full run
|
|
|
|
|
+ control parity (plan 14 B1): Retry supervision for a
|
|
|
|
|
+ failed goal, Requeue-to-resume for a run stale/parked
|
|
|
|
|
+ on a dead saddle, Cancel. NO notify-me toggle — goals
|
|
|
|
|
+ notify unconditionally by design. Yeehaw stays on
|
|
|
|
|
+ task rows only. -->
|
|
|
<section class="card goal-head">
|
|
<section class="card goal-head">
|
|
|
<div class="card-head">
|
|
<div class="card-head">
|
|
|
<h3>Status</h3>
|
|
<h3>Status</h3>
|
|
@@ -326,9 +340,9 @@
|
|
|
task events queue and coalesce into the resume.</p>
|
|
task events queue and coalesce into the resume.</p>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- The agent's live progress feed (task-page pattern):
|
|
|
|
|
- the newest line leads, its history behind the
|
|
|
|
|
- expander. -->
|
|
|
|
|
|
|
+ <!-- The agent's live progress feed (task-page pattern),
|
|
|
|
|
+ inside the status region: the newest line leads, its
|
|
|
|
|
+ history behind the expander. -->
|
|
|
<h3>Agent progress</h3>
|
|
<h3>Agent progress</h3>
|
|
|
<div stm-if="goal.progress.length > 0">
|
|
<div stm-if="goal.progress.length > 0">
|
|
|
<p class="progress-latest" stm-text="goal.progress[0].summary">latest</p>
|
|
<p class="progress-latest" stm-text="goal.progress[0].summary">latest</p>
|
|
@@ -346,9 +360,9 @@
|
|
|
<p stm-if="goal.progress.length == 0" class="muted">No progress reports yet — the goal
|
|
<p stm-if="goal.progress.length == 0" class="muted">No progress reports yet — the goal
|
|
|
agent reports via <code>saddle progress-update</code>.</p>
|
|
agent reports via <code>saddle progress-update</code>.</p>
|
|
|
|
|
|
|
|
- <!-- Current activity (task-page parity): what the agent's
|
|
|
|
|
- open round is doing right now, plus its saddle's
|
|
|
|
|
- health. -->
|
|
|
|
|
|
|
+ <!-- Current activity (task-page parity), inside the
|
|
|
|
|
+ status region: what the agent's open round is doing
|
|
|
|
|
+ right now, plus its saddle's health. -->
|
|
|
<section class="card goal-activity" stm-if="goal.run_task_id > 0">
|
|
<section class="card goal-activity" stm-if="goal.run_task_id > 0">
|
|
|
<h3>Current activity</h3>
|
|
<h3>Current activity</h3>
|
|
|
<p stm-if="goal.current_command.length > 0">
|
|
<p stm-if="goal.current_command.length > 0">
|
|
@@ -361,6 +375,116 @@
|
|
|
stm-text="goal.saddle_health">health</p>
|
|
stm-text="goal.saddle_health">health</p>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
+ <!-- ATTENTION (plan 14 B5 order): the goal agent's
|
|
|
|
|
+ answerable blocks lead — questions and RFCs with full
|
|
|
|
|
+ markdown bodies and inline answer forms, then the
|
|
|
|
|
+ completion review when one awaits. -->
|
|
|
|
|
+ <section class="card" stm-if="goal.blocks.length > 0">
|
|
|
|
|
+ <h3>Goal agent blocks</h3>
|
|
|
|
|
+ <div stm-for-block-in="goal.blocks" class="goal-block">
|
|
|
|
|
+ <div stm-if="!block.is_plan_review && !block.is_completion_review">
|
|
|
|
|
+ <p><span stm-attribute.class="'badge badge-block-' + block.block_type"
|
|
|
|
|
+ stm-text="block.block_type">kind</span>
|
|
|
|
|
+ <strong stm-text="block.question">question</strong>
|
|
|
|
|
+ <span class="muted" stm-text="block.created_display">when</span></p>
|
|
|
|
|
+ <div stm-if="block.show_body && block.body.length > 0"
|
|
|
|
|
+ class="md rfc-body goal-body" stm-markdown="block.body">body</div>
|
|
|
|
|
+ <blockquote stm-if="block.answered" class="term-comment-quote">
|
|
|
|
|
+ <span stm-text="block.answered_by">who</span>:
|
|
|
|
|
+ <span stm-text="block.answer">answer</span></blockquote>
|
|
|
|
|
+ <form stm-if="!block.answered" stm-action="block.answer_action">
|
|
|
|
|
+ <div stm-if="block.options.length > 0" class="form-row">
|
|
|
|
|
+ <label>Options</label>
|
|
|
|
|
+ <select name="option">
|
|
|
|
|
+ <option stm-for-option-in="block.options" stm-attribute.value="option"
|
|
|
|
|
+ stm-text="option">opt</option>
|
|
|
|
|
+ </select></div>
|
|
|
|
|
+ <div class="form-row">
|
|
|
|
|
+ <textarea name="answer" rows="2"
|
|
|
|
|
+ placeholder="Reply (or pick an option)"></textarea></div>
|
|
|
|
|
+ <button type="submit" class="primary">Answer</button>
|
|
|
|
|
+ </form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </section>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- Completion review: the report, compare link (an
|
|
|
|
|
+ answerable attention block). -->
|
|
|
|
|
+ <section class="card" stm-if="goal.completion_pending">
|
|
|
|
|
+ <h3>Completion review</h3>
|
|
|
|
|
+ <p stm-if="goal.push_branches.length > 0">Goal branches:
|
|
|
|
|
+ <span stm-for-branch-in="goal.push_branches">
|
|
|
|
|
+ <code stm-text="branch.branch">b</code>
|
|
|
|
|
+ <span stm-attribute.class="branch.pushed ? 'badge badge-done' : 'badge badge-failed'"
|
|
|
|
|
+ stm-text="branch.pushed ? 'pushed' : 'unpushed'">state</span>
|
|
|
|
|
+ </span></p>
|
|
|
|
|
+ <p><a stm-if="goal.compare_url.length > 0" stm-attribute.href="goal.compare_url"
|
|
|
|
|
+ target="_blank" rel="noopener">Compare changes</a></p>
|
|
|
|
|
+ <div class="md rfc-body goal-body" stm-markdown="goal.completion_report">report</div>
|
|
|
|
|
+ <form stm-action="goal.completion_pending_block.answer_action" class="inline">
|
|
|
|
|
+ <input type="hidden" name="answer"
|
|
|
|
|
+ value="Review approved. Continue with the task.">
|
|
|
|
|
+ <button type="submit" class="approve">Accept goal</button>
|
|
|
|
|
+ </form>
|
|
|
|
|
+ <details>
|
|
|
|
|
+ <summary>Request changes</summary>
|
|
|
|
|
+ <form stm-action="goal.completion_pending_block.answer_action">
|
|
|
|
|
+ <div class="form-row">
|
|
|
|
|
+ <textarea name="answer" rows="4" required
|
|
|
|
|
+ placeholder="What remains to be done?"></textarea></div>
|
|
|
|
|
+ <button type="submit" class="reject">Send feedback</button>
|
|
|
|
|
+ </form>
|
|
|
|
|
+ </details>
|
|
|
|
|
+ </section>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- Task status strip + the goal's task list (plan 14 B5:
|
|
|
|
|
+ tasks above the brief; capability badges per row —
|
|
|
|
|
+ no editing here; yeehaw on rows only). -->
|
|
|
|
|
+ <section class="card">
|
|
|
|
|
+ <h3>Tasks</h3>
|
|
|
|
|
+ <p class="goal-strip">
|
|
|
|
|
+ <button type="button" stm-attribute.class="window.goalFilterClass('draft')"
|
|
|
|
|
+ onclick="window.goalSetFilter('draft')"
|
|
|
|
|
+ stm-text="'draft ' + goal.draft_tasks">draft</button>
|
|
|
|
|
+ <button type="button" stm-attribute.class="window.goalFilterClass('queued')"
|
|
|
|
|
+ onclick="window.goalSetFilter('queued')"
|
|
|
|
|
+ stm-text="'queued ' + goal.queued_tasks">queued</button>
|
|
|
|
|
+ <button type="button" stm-attribute.class="window.goalFilterClass('working')"
|
|
|
|
|
+ onclick="window.goalSetFilter('working')"
|
|
|
|
|
+ stm-text="'running ' + goal.running_tasks">running</button>
|
|
|
|
|
+ <button type="button" stm-attribute.class="window.goalFilterClass('done')"
|
|
|
|
|
+ onclick="window.goalSetFilter('done')"
|
|
|
|
|
+ stm-text="'done ' + goal.done_tasks">done</button>
|
|
|
|
|
+ <button type="button" stm-attribute.class="window.goalFilterClass('failed')"
|
|
|
|
|
+ onclick="window.goalSetFilter('failed')"
|
|
|
|
|
+ stm-text="'failed ' + goal.failed_tasks">failed</button>
|
|
|
|
|
+ <span class="muted">— click a status to filter</span>
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <table>
|
|
|
|
|
+ <thead><tr><th>#</th><th>Title</th><th>Status</th><th>Mode</th><th>Requires</th><th>Created by</th></tr></thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ <tr stm-for-goal_task-in="goal.goal_tasks"
|
|
|
|
|
+ stm-if="window.goalTaskVisible(goal_task)">
|
|
|
|
|
+ <td stm-text="goal_task.id">id</td>
|
|
|
|
|
+ <td><a stm-attribute.href="'/tasks/' + goal_task.id"
|
|
|
|
|
+ stm-text="goal_task.title">title</a></td>
|
|
|
|
|
+ <td><span stm-attribute.class="'badge badge-' + goal_task.status"
|
|
|
|
|
+ stm-text="goal_task.display">status</span>
|
|
|
|
|
+ <span class="badge badge-yeehaw" stm-if="goal_task.yeehaw">🤠</span></td>
|
|
|
|
|
+ <td><span stm-attribute.class="'badge badge-mode-' + goal_task.mode"
|
|
|
|
|
+ stm-text="goal_task.mode">mode</span></td>
|
|
|
|
|
+ <td><span stm-for-capability-in="goal_task.capabilities">
|
|
|
|
|
+ <span class="badge badge-capability"
|
|
|
|
|
+ stm-text="capability">tag</span> </span></td>
|
|
|
|
|
+ <td class="muted" stm-text="goal_task.creator">who</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr stm-if="goal.goal_tasks.length == 0">
|
|
|
|
|
+ <td colspan="6" class="muted">No tasks yet — the goal agent fans
|
|
|
|
|
+ them out once the plan is approved.</td></tr>
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </section>
|
|
|
|
|
+
|
|
|
<!-- The locked brief. -->
|
|
<!-- The locked brief. -->
|
|
|
<section class="card">
|
|
<section class="card">
|
|
|
<h3>Initial brief
|
|
<h3>Initial brief
|
|
@@ -394,9 +518,23 @@
|
|
|
</details>
|
|
</details>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- The plan: the approved markdown; the pending review;
|
|
|
|
|
- the revision history (approved + rejected) behind the
|
|
|
|
|
- expander, task-page pattern. -->
|
|
|
|
|
|
|
+ <!-- Plan 14 B5: the goal's effective rules — they govern
|
|
|
|
|
+ the agent and every worker it fans out. -->
|
|
|
|
|
+ <section class="card">
|
|
|
|
|
+ <h3>Rules</h3>
|
|
|
|
|
+ <p class="muted">The effective set dispatched with this goal's work — task rules,
|
|
|
|
|
+ the primary project's, then co-developed projects' in link order.</p>
|
|
|
|
|
+ <div stm-for-rule-in="goal.rules" class="rule-card">
|
|
|
|
|
+ <h4 stm-text="rule.name">name</h4>
|
|
|
|
|
+ <div class="md" stm-markdown="rule.body">body</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <p stm-if="goal.rules.length == 0" class="muted">No rules apply to this goal.</p>
|
|
|
|
|
+ </section>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- The plan: the approved markdown; the pending review
|
|
|
|
|
+ with the remarks queue (plan 14 B2); the revision
|
|
|
|
|
+ history (approved + rejected) behind the expander,
|
|
|
|
|
+ task-page pattern. -->
|
|
|
<section class="card">
|
|
<section class="card">
|
|
|
<h3>Plan</h3>
|
|
<h3>Plan</h3>
|
|
|
<div stm-if="goal.plan.length > 0" class="md rfc-body goal-body" data-plan-body
|
|
<div stm-if="goal.plan.length > 0" class="md rfc-body goal-body" data-plan-body
|
|
@@ -404,7 +542,8 @@
|
|
|
<p stm-if="goal.plan.length == 0 && goal.plan_pending_block == null"
|
|
<p stm-if="goal.plan.length == 0 && goal.plan_pending_block == null"
|
|
|
class="muted">No approved plan yet.</p>
|
|
class="muted">No approved plan yet.</p>
|
|
|
|
|
|
|
|
- <div stm-if="goal.plan_pending_block != null && goal.plan_pending_block != false" class="plan-review" data-plan-review
|
|
|
|
|
|
|
+ <div stm-if="goal.plan_pending_block != null && goal.plan_pending_block != false"
|
|
|
|
|
+ class="plan-review" data-plan-review
|
|
|
stm-attribute.data-block-id="goal.plan_pending_block.id">
|
|
stm-attribute.data-block-id="goal.plan_pending_block.id">
|
|
|
<h4>Plan submitted for review</h4>
|
|
<h4>Plan submitted for review</h4>
|
|
|
<div class="md rfc-body goal-body" data-plan-body
|
|
<div class="md rfc-body goal-body" data-plan-body
|
|
@@ -445,77 +584,6 @@
|
|
|
</details>
|
|
</details>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- Completion review: the report, compare link. -->
|
|
|
|
|
- <section class="card" stm-if="goal.completion_pending">
|
|
|
|
|
- <h3>Completion review</h3>
|
|
|
|
|
- <p stm-if="goal.push_branches.length > 0">Goal branches:
|
|
|
|
|
- <span stm-for-branch-in="goal.push_branches">
|
|
|
|
|
- <code stm-text="branch.branch">b</code>
|
|
|
|
|
- <span stm-attribute.class="branch.pushed ? 'badge badge-done' : 'badge badge-failed'"
|
|
|
|
|
- stm-text="branch.pushed ? 'pushed' : 'unpushed'">state</span>
|
|
|
|
|
- </span></p>
|
|
|
|
|
- <p><a stm-if="goal.compare_url.length > 0" stm-attribute.href="goal.compare_url"
|
|
|
|
|
- target="_blank" rel="noopener">Compare changes</a></p>
|
|
|
|
|
- <div class="md rfc-body goal-body" stm-markdown="goal.completion_report">report</div>
|
|
|
|
|
- <form stm-action="goal.completion_pending_block.answer_action" class="inline">
|
|
|
|
|
- <input type="hidden" name="answer"
|
|
|
|
|
- value="Review approved. Continue with the task.">
|
|
|
|
|
- <button type="submit" class="approve">Accept goal</button>
|
|
|
|
|
- </form>
|
|
|
|
|
- <details>
|
|
|
|
|
- <summary>Request changes</summary>
|
|
|
|
|
- <form stm-action="goal.completion_pending_block.answer_action">
|
|
|
|
|
- <div class="form-row">
|
|
|
|
|
- <textarea name="answer" rows="4" required
|
|
|
|
|
- placeholder="What remains to be done?"></textarea></div>
|
|
|
|
|
- <button type="submit" class="reject">Send feedback</button>
|
|
|
|
|
- </form>
|
|
|
|
|
- </details>
|
|
|
|
|
- </section>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Task status strip + the goal's task list. -->
|
|
|
|
|
- <section class="card">
|
|
|
|
|
- <h3>Tasks</h3>
|
|
|
|
|
- <p class="goal-strip">
|
|
|
|
|
- <button type="button" stm-attribute.class="window.goalFilterClass('draft')"
|
|
|
|
|
- onclick="window.goalSetFilter('draft')"
|
|
|
|
|
- stm-text="'draft ' + goal.draft_tasks">draft</button>
|
|
|
|
|
- <button type="button" stm-attribute.class="window.goalFilterClass('queued')"
|
|
|
|
|
- onclick="window.goalSetFilter('queued')"
|
|
|
|
|
- stm-text="'queued ' + goal.queued_tasks">queued</button>
|
|
|
|
|
- <button type="button" stm-attribute.class="window.goalFilterClass('working')"
|
|
|
|
|
- onclick="window.goalSetFilter('working')"
|
|
|
|
|
- stm-text="'running ' + goal.running_tasks">running</button>
|
|
|
|
|
- <button type="button" stm-attribute.class="window.goalFilterClass('done')"
|
|
|
|
|
- onclick="window.goalSetFilter('done')"
|
|
|
|
|
- stm-text="'done ' + goal.done_tasks">done</button>
|
|
|
|
|
- <button type="button" stm-attribute.class="window.goalFilterClass('failed')"
|
|
|
|
|
- onclick="window.goalSetFilter('failed')"
|
|
|
|
|
- stm-text="'failed ' + goal.failed_tasks">failed</button>
|
|
|
|
|
- <span class="muted">— click a status to filter</span>
|
|
|
|
|
- </p>
|
|
|
|
|
- <table>
|
|
|
|
|
- <thead><tr><th>#</th><th>Title</th><th>Status</th><th>Mode</th><th>Created by</th></tr></thead>
|
|
|
|
|
- <tbody>
|
|
|
|
|
- <tr stm-for-goal_task-in="goal.goal_tasks"
|
|
|
|
|
- stm-if="window.goalTaskVisible(goal_task)">
|
|
|
|
|
- <td stm-text="goal_task.id">id</td>
|
|
|
|
|
- <td><a stm-attribute.href="'/tasks/' + goal_task.id"
|
|
|
|
|
- stm-text="goal_task.title">title</a></td>
|
|
|
|
|
- <td><span stm-attribute.class="'badge badge-' + goal_task.status"
|
|
|
|
|
- stm-text="goal_task.display">status</span>
|
|
|
|
|
- <span class="badge badge-yeehaw" stm-if="goal_task.yeehaw">🤠</span></td>
|
|
|
|
|
- <td><span stm-attribute.class="'badge badge-mode-' + goal_task.mode"
|
|
|
|
|
- stm-text="goal_task.mode">mode</span></td>
|
|
|
|
|
- <td class="muted" stm-text="goal_task.creator">who</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- <tr stm-if="goal.goal_tasks.length == 0">
|
|
|
|
|
- <td colspan="5" class="muted">No tasks yet — the goal agent fans
|
|
|
|
|
- them out once the plan is approved.</td></tr>
|
|
|
|
|
- </tbody>
|
|
|
|
|
- </table>
|
|
|
|
|
- </section>
|
|
|
|
|
-
|
|
|
|
|
<!-- The supervision narrative: one chronological feed of
|
|
<!-- The supervision narrative: one chronological feed of
|
|
|
the goal agent's life (markdown bodies — reports land
|
|
the goal agent's life (markdown bodies — reports land
|
|
|
here whole). -->
|
|
here whole). -->
|
|
@@ -567,37 +635,6 @@
|
|
|
</dialog>
|
|
</dialog>
|
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
- <!-- The goal agent's blocks (questions/RFCs) with full
|
|
|
|
|
- markdown bodies and their inline answer forms. -->
|
|
|
|
|
- <section class="card" stm-if="goal.blocks.length > 0">
|
|
|
|
|
- <h3>Goal agent blocks</h3>
|
|
|
|
|
- <div stm-for-block-in="goal.blocks" class="goal-block">
|
|
|
|
|
- <div stm-if="!block.is_plan_review && !block.is_completion_review">
|
|
|
|
|
- <p><span stm-attribute.class="'badge badge-block-' + block.block_type"
|
|
|
|
|
- stm-text="block.block_type">kind</span>
|
|
|
|
|
- <strong stm-text="block.question">question</strong>
|
|
|
|
|
- <span class="muted" stm-text="block.created_display">when</span></p>
|
|
|
|
|
- <div stm-if="block.show_body && block.body.length > 0"
|
|
|
|
|
- class="md rfc-body goal-body" stm-markdown="block.body">body</div>
|
|
|
|
|
- <blockquote stm-if="block.answered" class="term-comment-quote">
|
|
|
|
|
- <span stm-text="block.answered_by">who</span>:
|
|
|
|
|
- <span stm-text="block.answer">answer</span></blockquote>
|
|
|
|
|
- <form stm-if="!block.answered" stm-action="block.answer_action">
|
|
|
|
|
- <div stm-if="block.options.length > 0" class="form-row">
|
|
|
|
|
- <label>Options</label>
|
|
|
|
|
- <select name="option">
|
|
|
|
|
- <option stm-for-option-in="block.options" stm-attribute.value="option"
|
|
|
|
|
- stm-text="option">opt</option>
|
|
|
|
|
- </select></div>
|
|
|
|
|
- <div class="form-row">
|
|
|
|
|
- <textarea name="answer" rows="2"
|
|
|
|
|
- placeholder="Reply (or pick an option)"></textarea></div>
|
|
|
|
|
- <button type="submit" class="primary">Answer</button>
|
|
|
|
|
- </form>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </section>
|
|
|
|
|
-
|
|
|
|
|
<!-- Goal agent runs: every round with its host saddle; the
|
|
<!-- Goal agent runs: every round with its host saddle; the
|
|
|
terminal links open in a new tab (the session picker
|
|
terminal links open in a new tab (the session picker
|
|
|
lives on the terminal page). -->
|
|
lives on the terminal page). -->
|