|
|
@@ -60,7 +60,7 @@
|
|
|
<section>
|
|
|
<h2 stm-if="task != null && task.exists">#<span stm-text="task.id">id</span> —
|
|
|
<span stm-text="task.title">title</span></h2>
|
|
|
- <p stm-if="task != null && !task.exists" class="muted">Task not found.</p>
|
|
|
+ <p stm-if="task != null && !task.exists" class="text-muted">Task not found.</p>
|
|
|
|
|
|
<div stm-if="task != null && task.exists">
|
|
|
<!-- Goal 8 task 4: a standalone task (no project) shows
|
|
|
@@ -73,7 +73,7 @@
|
|
|
stm-text="'#' + task.enqueue_after_task_id">after</a></span></p>
|
|
|
<p stm-if="task.project_id == 0"><a href="/tasks">All tasks</a> ·
|
|
|
<strong>(standalone)</strong>
|
|
|
- <span class="muted">— no project: the agent works in its own ephemeral
|
|
|
+ <span class="text-muted">— no project: the agent works in its own ephemeral
|
|
|
workspace and delivers its completion report</span></p>
|
|
|
|
|
|
<!-- Progress feed ABOVE the status card (plan 11 task D):
|
|
|
@@ -81,7 +81,7 @@
|
|
|
behind the "Show history" expander. -->
|
|
|
<h3>Progress</h3>
|
|
|
<pstm-fragment name="progress-feed" entries="task.progress"/>
|
|
|
- <p stm-if="task.progress.length == 0" class="muted">No progress reports yet — the agent reports via
|
|
|
+ <p stm-if="task.progress.length == 0" class="text-muted">No progress reports yet — the agent reports via
|
|
|
<code>saddle progress-update</code>.</p>
|
|
|
|
|
|
<!-- Status + description side by side in a 50/50 grid (plan
|
|
|
@@ -97,29 +97,29 @@
|
|
|
<p><span stm-attribute.class="'badge badge-' + task.status" stm-text="task.display">status</span>
|
|
|
<span stm-attribute.class="'badge badge-mode-' + task.mode" stm-text="task.mode">mode</span>
|
|
|
· priority <strong stm-text="task.priority">5</strong></p>
|
|
|
- <p class="muted" stm-if="task.enqueue_after_task_id > 0">Auto-enqueues after
|
|
|
+ <p class="text-muted" stm-if="task.enqueue_after_task_id > 0">Auto-enqueues after
|
|
|
<a stm-attribute.href="'/tasks/' + task.enqueue_after_task_id"
|
|
|
stm-text="'#' + task.enqueue_after_task_id + ' ' + task.enqueue_after_title">after</a></p>
|
|
|
- <p class="muted">Created <span stm-text="task.created_display">when</span></p>
|
|
|
- <p class="muted" stm-if="task.started_display.length > 0">Started <span stm-text="task.started_display">when</span></p>
|
|
|
- <p class="muted" stm-if="task.completed_display.length > 0">Completed <span stm-text="task.completed_display">when</span></p>
|
|
|
+ <p class="text-muted">Created <span stm-text="task.created_display">when</span></p>
|
|
|
+ <p class="text-muted" stm-if="task.started_display.length > 0">Started <span stm-text="task.started_display">when</span></p>
|
|
|
+ <p class="text-muted" stm-if="task.completed_display.length > 0">Completed <span stm-text="task.completed_display">when</span></p>
|
|
|
<!-- S5: the aggregate LLM usage stat line (empty for
|
|
|
zero-usage tasks renders nothing). -->
|
|
|
- <p class="muted" stm-if="task.usage_line.length > 0"
|
|
|
+ <p class="text-muted" stm-if="task.usage_line.length > 0"
|
|
|
stm-text="task.usage_line">LLM: 1,234 calls · 45.2M in / 1.1M out tok · 3h 12m</p>
|
|
|
<p stm-if="task.task_branch.length > 0">Branch: <strong stm-text="task.task_branch">branch</strong>
|
|
|
- <span class="muted" stm-if="task.branch_from.length > 0"> from <span stm-text="task.branch_from">base</span></span></p>
|
|
|
- <p stm-if="task.status == 'suspended'" class="muted">Parked (`saddle suspend`) —
|
|
|
+ <span class="text-muted" stm-if="task.branch_from.length > 0"> from <span stm-text="task.branch_from">base</span></span></p>
|
|
|
+ <p stm-if="task.status == 'suspended'" class="text-muted">Parked (`saddle suspend`) —
|
|
|
the goal agent resumes on its goal's task events, with the
|
|
|
batched status report riding the resume.</p>
|
|
|
- <form class="inline">
|
|
|
+ <form class="cluster">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
- <button type="button" stm-if="task.draft" class="primary"
|
|
|
+ <button type="button" stm-if="task.draft" class="btn-primary"
|
|
|
stm-action="task.enqueue">Enqueue task</button>
|
|
|
<button type="button" stm-if="task.draft"
|
|
|
stm-action="task.delete"
|
|
|
stm-confirm="Delete this draft task? This cannot be undone.">Delete</button>
|
|
|
- <button type="button" stm-if="task.status == 'failed'" class="primary"
|
|
|
+ <button type="button" stm-if="task.status == 'failed'" class="btn-primary"
|
|
|
stm-action="task.retry">Retry task</button>
|
|
|
<button type="button" stm-if="task.resume_available"
|
|
|
stm-action="task.resume"
|
|
|
@@ -133,11 +133,11 @@
|
|
|
<button type="button" stm-if="!task.draft && !task.terminal"
|
|
|
stm-action="task.cancel" stm-confirm="Cancel this task?">Cancel task</button>
|
|
|
</form>
|
|
|
- <form class="inline">
|
|
|
+ <form class="cluster">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
<button type="button" stm-action="task.toggle_notify"
|
|
|
stm-text="task.notify_me ? 'Don't notify me' : 'Notify me'">Notify me</button>
|
|
|
- <span class="muted">— this task's first start, failure and completion
|
|
|
+ <span class="text-muted">— this task's first start, failure and completion
|
|
|
(questions and reviews always notify subscribed users)</span>
|
|
|
</form>
|
|
|
</section>
|
|
|
@@ -149,7 +149,7 @@
|
|
|
<p><span stm-attribute.class="'badge badge-' + task.goal_status"
|
|
|
stm-text="task.goal_status.replace('_', ' ')">status</span>
|
|
|
<a stm-attribute.href="'/goals/' + task.goal_id" stm-text="task.goal_title">goal</a></p>
|
|
|
- <p class="muted">Goal branch <code stm-text="task.goal_branch">branch</code>
|
|
|
+ <p class="text-muted">Goal branch <code stm-text="task.goal_branch">branch</code>
|
|
|
<span stm-if="task.is_goal_run">— this task IS the goal agent's run
|
|
|
(orchestrate mode; the goal page owns its lifecycle)</span>
|
|
|
<span stm-if="!task.is_goal_run">— this task runs under the goal agent's
|
|
|
@@ -166,11 +166,11 @@
|
|
|
<section class="card" data-long-form data-field="task"
|
|
|
data-lf-open="0">
|
|
|
<h3>Mandate
|
|
|
- <button type="button" class="inline" stm-if="task.editable_all"
|
|
|
+ <button type="button" class="cluster" stm-if="task.editable_all"
|
|
|
data-lf-toggle>Edit</button></h3>
|
|
|
<div data-lf-view>
|
|
|
<div stm-if="task.description.length > 0" class="md" stm-markdown="task.description">description</div>
|
|
|
- <p class="muted" stm-if="task.description.length == 0">No mandate.</p>
|
|
|
+ <p class="text-muted" stm-if="task.description.length == 0">No mandate.</p>
|
|
|
</div>
|
|
|
<!-- The stm-if wrapper (not the form itself) owns
|
|
|
draft-gating: statum toggles `hidden` on
|
|
|
@@ -179,7 +179,7 @@
|
|
|
<div stm-if="task.editable_all">
|
|
|
<form data-lf-edit hidden stm-action="task.update">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
- <div class="form-row"><label>Mandate</label>
|
|
|
+ <div class="field"><label>Mandate</label>
|
|
|
<textarea name="description" rows="8"
|
|
|
data-lf-src="task.description">description</textarea></div>
|
|
|
<button type="submit">Save</button>
|
|
|
@@ -211,37 +211,37 @@
|
|
|
properties only. -->
|
|
|
<details class="edit-expander" stm-if="task.editable_all || task.editable_priority">
|
|
|
<summary><strong>Edit task</strong>
|
|
|
- <span class="muted" stm-if="task.editable_all">— every field except status while in draft</span>
|
|
|
- <span class="muted" stm-if="!task.editable_all && task.editable_priority">— priority only once work has begun</span></summary>
|
|
|
+ <span class="text-muted" stm-if="task.editable_all">— every field except status while in draft</span>
|
|
|
+ <span class="text-muted" stm-if="!task.editable_all && task.editable_priority">— priority only once work has begun</span></summary>
|
|
|
<form stm-action="task.update" stm-if="task.editable_all">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
- <div class="form-row"><label>Title</label>
|
|
|
+ <div class="field"><label>Title</label>
|
|
|
<input type="text" name="title" stm-attribute.value="task.title"></div>
|
|
|
- <div class="form-row" stm-if="!task.is_goal_run"><label>Mode</label>
|
|
|
+ <div class="field" stm-if="!task.is_goal_run"><label>Mode</label>
|
|
|
<select name="mode" stm-attribute.value="task.mode">
|
|
|
<option value="implement">implement — build the change on a task branch</option>
|
|
|
<option value="investigate">investigate — explore and report, no code changes</option>
|
|
|
<option value="review">review — read and critique existing work</option>
|
|
|
<option value="test">test — write and run tests</option>
|
|
|
</select></div>
|
|
|
- <div class="form-row" stm-if="task.creator == 'human' && !task.is_goal_run"><label>Auto-enqueue after
|
|
|
- <span class="muted">(enqueues itself when the predecessor is done; none clears it)</span></label>
|
|
|
+ <div class="field" stm-if="task.creator == 'human' && !task.is_goal_run"><label>Auto-enqueue after
|
|
|
+ <span class="text-muted">(enqueues itself when the predecessor is done; none clears it)</span></label>
|
|
|
<select name="enqueue_after_task_id">
|
|
|
<option value="">none</option>
|
|
|
<option stm-for-option-in="task.enqueue_after_options" stm-attribute.value="option.id"
|
|
|
stm-text="'#' + option.id + ' ' + option.title">task</option>
|
|
|
</select></div>
|
|
|
- <div class="form-row"><label>Priority (1–9)</label>
|
|
|
+ <div class="field"><label>Priority (1–9)</label>
|
|
|
<input type="number" name="priority" min="1" max="9" stm-attribute.value="task.priority"></div>
|
|
|
- <div class="form-row"><label>Task branch</label>
|
|
|
+ <div class="field"><label>Task branch</label>
|
|
|
<input type="text" name="task_branch" stm-attribute.value="task.task_branch" placeholder="task/<id>-<slug>"></div>
|
|
|
- <div class="form-row"><label>Branch from</label>
|
|
|
+ <div class="field"><label>Branch from</label>
|
|
|
<input type="text" name="branch_from" stm-attribute.value="task.branch_from"></div>
|
|
|
<button type="submit">Save</button>
|
|
|
</form>
|
|
|
<form stm-action="task.update" stm-if="!task.editable_all && task.editable_priority">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
- <div class="form-row"><label>Priority (1–9)</label>
|
|
|
+ <div class="field"><label>Priority (1–9)</label>
|
|
|
<input type="number" name="priority" min="1" max="9" stm-attribute.value="task.priority"></div>
|
|
|
<button type="submit">Save</button>
|
|
|
</form>
|
|
|
@@ -249,7 +249,7 @@
|
|
|
|
|
|
<!-- Current blocks render in full (plan 11 task D);
|
|
|
answered ones fold behind the history expander. -->
|
|
|
- <h3>Blocks <span class="muted" stm-if="task.open_blocks.length > 0">(<span stm-text="task.open_blocks.length">0</span> open)</span></h3>
|
|
|
+ <h3>Blocks <span class="text-muted" stm-if="task.open_blocks.length > 0">(<span stm-text="task.open_blocks.length">0</span> open)</span></h3>
|
|
|
<div stm-for-block-in="task.open_blocks" stm-key="block.id"
|
|
|
stm-attribute.class="'block-card ' + block.block_type + (block.answered ? ' answered' : '')">
|
|
|
<div stm-if="!block.answered && block.block_type == 'review'" class="review-banner">
|
|
|
@@ -259,33 +259,33 @@
|
|
|
<a stm-if="task.review_diff_url.length > 0" stm-attribute.href="task.review_diff_url"
|
|
|
target="_blank" rel="noopener">· compare changes</a></p>
|
|
|
<div class="actions">
|
|
|
- <form stm-action="block.answer_action" class="inline">
|
|
|
+ <form stm-action="block.answer_action" class="cluster">
|
|
|
<input type="hidden" name="verdict" value="accept">
|
|
|
- <button type="submit" class="approve">Approve</button>
|
|
|
+ <button type="submit" class="btn-primary">Approve</button>
|
|
|
</form>
|
|
|
- <form stm-action="block.answer_action" class="inline">
|
|
|
+ <form stm-action="block.answer_action" class="cluster">
|
|
|
<textarea name="feedback" rows="2" placeholder="What should change?"></textarea>
|
|
|
- <button type="submit" class="reject">Request changes</button>
|
|
|
+ <button type="submit" class="btn-danger">Request changes</button>
|
|
|
</form>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<p><span stm-attribute.class="'badge badge-' + block.block_type" stm-text="block.block_type">type</span>
|
|
|
- <span class="muted" stm-text="block.created_display">when</span></p>
|
|
|
+ <span class="text-muted" stm-text="block.created_display">when</span></p>
|
|
|
|
|
|
<div stm-if="block.show_body && block.body.length > 0" class="md rfc-body"
|
|
|
stm-markdown="block.body">body</div>
|
|
|
|
|
|
<div stm-if="block.answered">
|
|
|
<p>Answer: <strong stm-text="block.answer">answer</strong>
|
|
|
- <span class="muted" stm-text="block.answered_display">when</span>
|
|
|
+ <span class="text-muted" stm-text="block.answered_display">when</span>
|
|
|
<span class="badge" stm-if="block.answered_by == 'auto'">auto</span></p>
|
|
|
</div>
|
|
|
|
|
|
<pstm-fragment name="block-answer"/>
|
|
|
<pstm-fragment name="block-reply"/>
|
|
|
</div>
|
|
|
- <p stm-if="task.open_blocks.length == 0 && task.answered_blocks.length == 0" class="muted">No blocks — the agent has no open questions.</p>
|
|
|
+ <p stm-if="task.open_blocks.length == 0 && task.answered_blocks.length == 0" class="text-muted">No blocks — the agent has no open questions.</p>
|
|
|
|
|
|
<!-- Historical (answered) blocks behind an expander, the
|
|
|
current ones in full above (plan 11 task D). -->
|
|
|
@@ -295,11 +295,11 @@
|
|
|
stm-attribute.class="'block-card answered ' + block.block_type">
|
|
|
<p><span stm-attribute.class="'badge badge-' + block.block_type" stm-text="block.block_type">type</span>
|
|
|
<span stm-text="block.question">question</span>
|
|
|
- <span class="muted" stm-text="block.created_display">when</span></p>
|
|
|
+ <span class="text-muted" stm-text="block.created_display">when</span></p>
|
|
|
<div stm-if="block.show_body && block.body.length > 0" class="md rfc-body"
|
|
|
stm-markdown="block.body">body</div>
|
|
|
<p>Answer: <strong stm-text="block.answer">answer</strong>
|
|
|
- <span class="muted" stm-text="block.answered_display">when</span>
|
|
|
+ <span class="text-muted" stm-text="block.answered_display">when</span>
|
|
|
<span class="badge" stm-if="block.answered_by == 'auto'">auto</span></p>
|
|
|
</div>
|
|
|
</details>
|
|
|
@@ -311,11 +311,11 @@
|
|
|
<div stm-for-comment-in="task.comments" stm-attribute.class="'comment' + (comment.from_agent ? ' agent' : '') + (comment.is_system ? ' system' : '')">
|
|
|
<strong stm-if="!comment.is_system" stm-text="comment.author">author</strong>
|
|
|
<span stm-if="comment.is_system" class="system-label">system</span>
|
|
|
- <span class="muted" stm-text="comment.when_display">when</span>
|
|
|
+ <span class="text-muted" stm-text="comment.when_display">when</span>
|
|
|
<div class="md" stm-markdown="comment.body">body</div>
|
|
|
<blockquote stm-if="comment.quote.length > 0" stm-text="comment.quote">quote</blockquote>
|
|
|
</div>
|
|
|
- <p stm-if="task.comments.length == 0" class="muted">No comments yet.</p>
|
|
|
+ <p stm-if="task.comments.length == 0" class="text-muted">No comments yet.</p>
|
|
|
<!-- Goal 8 task 4: comments stay OPEN on terminal tasks.
|
|
|
A terminal NON-GOAL task resurrects on comment (it
|
|
|
re-queues with the comment injected); a terminal
|
|
|
@@ -323,14 +323,14 @@
|
|
|
voice — the hint says so and the service refuses. -->
|
|
|
<form stm-if="!(task.terminal && task.goal_id > 0)" stm-action="task.comment">
|
|
|
<input type="hidden" name="task_id" stm-attribute.value="task.id">
|
|
|
- <div class="form-row"><label for="comment-body">Add comment</label>
|
|
|
+ <div class="field"><label for="comment-body">Add comment</label>
|
|
|
<textarea id="comment-body" name="body" rows="3" placeholder="A comment for the agent"></textarea></div>
|
|
|
- <p stm-if="task.terminal && task.goal_id == 0" class="muted">
|
|
|
+ <p stm-if="task.terminal && task.goal_id == 0" class="text-muted">
|
|
|
This task is terminal — commenting re-queues it for another round
|
|
|
with your comment injected.</p>
|
|
|
- <button type="submit" class="primary">Comment</button>
|
|
|
+ <button type="submit" class="btn-primary">Comment</button>
|
|
|
</form>
|
|
|
- <p stm-if="task.terminal && task.goal_id > 0" class="muted">
|
|
|
+ <p stm-if="task.terminal && task.goal_id > 0" class="text-muted">
|
|
|
Comments are closed — this task belongs to its goal; the goal agent
|
|
|
(its goal's page) owns the conversation.</p>
|
|
|
|
|
|
@@ -345,22 +345,22 @@
|
|
|
<input type="hidden" name="quote">
|
|
|
<input type="hidden" name="return_to">
|
|
|
<textarea name="body" rows="4" placeholder="Your comment…" style="width:100%; margin:0.5em 0;"></textarea>
|
|
|
- <button type="submit" class="primary">Send comment</button>
|
|
|
+ <button type="submit" class="btn-primary">Send comment</button>
|
|
|
<button type="button" onclick="document.getElementById('quote-comment-dialog').close()">Cancel</button>
|
|
|
</form>
|
|
|
</dialog>
|
|
|
|
|
|
<h3>Rules</h3>
|
|
|
- <p class="muted">Task rules lead the effective set dispatched with this task.</p>
|
|
|
+ <p class="text-muted">Task rules lead the effective set dispatched with this task.</p>
|
|
|
<div stm-for-rule-in="task.rules" stm-key="rule.link_id" class="card">
|
|
|
<h3 stm-text="rule.name">name</h3>
|
|
|
<div class="md" stm-markdown="rule.body">body</div>
|
|
|
- <form class="inline">
|
|
|
+ <form class="cluster">
|
|
|
<button type="button" stm-action="rule.detach" stm-confirm="Detach this rule?">Detach</button>
|
|
|
</form>
|
|
|
</div>
|
|
|
- <p stm-if="task.rules.length == 0" class="muted">No task-specific rules.</p>
|
|
|
- <form class="inline" stm-action="task.attach_rule" stm-if="task.rule_options.length > 0">
|
|
|
+ <p stm-if="task.rules.length == 0" class="text-muted">No task-specific rules.</p>
|
|
|
+ <form class="cluster" stm-action="task.attach_rule" stm-if="task.rule_options.length > 0">
|
|
|
<label for="task-rule-target">Attach rule</label>
|
|
|
<select id="task-rule-target" name="rule_id" required>
|
|
|
<option stm-for-option-in="task.rule_options" stm-attribute.value="option.id"
|
|
|
@@ -370,16 +370,16 @@
|
|
|
</form>
|
|
|
|
|
|
<h3>Required capabilities</h3>
|
|
|
- <p class="muted">The dispatcher only assigns this task to a saddle carrying all of these tags.</p>
|
|
|
+ <p class="text-muted">The dispatcher only assigns this task to a saddle carrying all of these tags.</p>
|
|
|
<p stm-if="task.capabilities.length > 0">
|
|
|
<span stm-for-capability-in="task.capabilities" stm-key="capability.link_id">
|
|
|
<span class="badge"><span stm-text="capability.name">tag</span>
|
|
|
- <button type="button" class="inline chip-remove"
|
|
|
+ <button type="button" class="btn-ghost chip-remove"
|
|
|
stm-action="capability.detach" stm-confirm="Remove this requirement?">×</button></span>
|
|
|
</span>
|
|
|
</p>
|
|
|
- <p stm-if="task.capabilities.length == 0" class="muted">No requirements — any idle saddle may run it.</p>
|
|
|
- <form class="inline" stm-action="task.attach_capability" stm-if="task.capability_options.length > 0">
|
|
|
+ <p stm-if="task.capabilities.length == 0" class="text-muted">No requirements — any idle saddle may run it.</p>
|
|
|
+ <form class="cluster" stm-action="task.attach_capability" stm-if="task.capability_options.length > 0">
|
|
|
<label for="task-capability-target">Require capability</label>
|
|
|
<select id="task-capability-target" name="capability_id" required>
|
|
|
<option stm-for-option-in="task.capability_options" stm-attribute.value="option.id"
|
|
|
@@ -389,7 +389,7 @@
|
|
|
</form>
|
|
|
|
|
|
<h3>Sessions</h3>
|
|
|
- <p stm-if="task.saddle_health.length > 0" class="muted"
|
|
|
+ <p stm-if="task.saddle_health.length > 0" class="text-muted"
|
|
|
stm-text="task.saddle_health">saddle health</p>
|
|
|
<table>
|
|
|
<thead><tr><th>#</th><th>Saddle</th><th>Started</th><th>Ended</th><th>Outcome</th><th></th></tr></thead>
|
|
|
@@ -404,7 +404,7 @@
|
|
|
<td><a stm-attribute.href="'/tasks/' + task.id + '/log'"
|
|
|
target="_blank" rel="noopener">Event log</a></td>
|
|
|
</tr>
|
|
|
- <tr stm-if="task.sessions.length == 0"><td colspan="6" class="muted">No sessions yet.</td></tr>
|
|
|
+ <tr stm-if="task.sessions.length == 0"><td colspan="6" class="text-muted">No sessions yet.</td></tr>
|
|
|
</tbody>
|
|
|
</table>
|
|
|
</div>
|