App.vue:183:                <Btn small @click="retryBoot">Retry</Btn>
chat/Compose.vue:168:                <span class="compose-quote-label">{{ quoteLabel }}</span>
chat/Compose.vue:169:                <TextDisplay class="compose-quote-text" :text="quote" />
chat/Compose.vue:170:                <button type="button" class="compose-quote-x" title="Not a reply after all" @click="emit('unquote')">×</button>
chat/Compose.vue:179:                <p class="compose-many-text">{{ many.text }}</p>
chat/Compose.vue:181:                    <Btn kind="primary" small @click="handOver">{{ many.action }}</Btn>
chat/Compose.vue:182:                    <Btn small @click="kept = draft.files.length">Just send them</Btn>
chat/Compose.vue:192:                            <button type="button" class="chip-x" title="Remove" @click="unpick(i)">×</button>
chat/Compose.vue:202:                :placeholder="placeholder"
chat/Compose.vue:203:                :aria-label="submit"
chat/Compose.vue:214:                <label class="compose-attach" title="Attach files" aria-label="Attach files">
chat/Compose.vue:219:                    <button type="button" class="compose-attach" :title="action.title" :aria-label="action.title" @click="use(action)">
chat/Compose.vue:230:                    :title="resting ? idle.title : ''"
chat/Compose.vue:250:                        <span class="compose-send-label">{{ submit }}</span>
chat/Compose.vue:256:            <p class="error">{{ draft.error }}</p>
chat/Compose.vue:259:            <p v-if="!draft.error && note" class="compose-note">{{ note }}</p>
chat/TurnQuote.vue:7:    <div class="thread-quote" title="Go to what this answers" @click.stop="emit('go')" v-html="html" />
chat/DumpLane.vue:10:        <span class="dump-lane-title">{{ title }}</span>
chat/DumpLane.vue:11:        <span class="dump-lane-meta">{{ meta }}</span>
chat/FeedBar.vue:44:            <TextInput class="feed-bar-filter" :value="filter" placeholder="Filter files" @input="emit('filter', $event.target.value)" />
chat/FeedBar.vue:65:                    Expand everything
chat/FeedBar.vue:69:                    Smaller text
chat/FeedBar.vue:73:                    Larger text
chat/FeedBar.vue:77:                    <span>Lines</span>
chat/ChatNotice.vue:42:        <span class="chat-notice-text">{{ notice.title }}</span>
chat/ChatNotice.vue:44:            <a class="chat-notice-go" :href="notice.data.link" target="_blank" rel="noopener">{{ notice.data.label || "open" }}</a>
chat/ChatNotice.vue:47:            <Btn small :disabled="working" @click="permit(true)">Allow</Btn>
chat/ChatNotice.vue:48:            <Btn small :disabled="working" @click="permit(false)">Deny</Btn>
chat/ChatNotice.vue:51:            <Btn small :busy="working" @click="force">Send now</Btn>
chat/ChatNotice.vue:54:            <CloseButton :class="{unarmed: !armed}" :disabled="working" title="Close this" @click="close" />
chat/ChatNotice.vue:57:            <Notice role="alert" class="chat-notice-error">{{ failure }}</Notice>
chat/ReplyTool.vue:7:    <button type="button" class="thread-tool" :title="title" @click.stop="emit('reply')">Reply</button>
chat/AgentBar.vue:102:                            heading="Monitors"
chat/AgentBar.vue:110:                            heading="Background commands"
chat/AgentBar.vue:118:                            heading="Subagents"
chat/AgentStopConfirm.vue:17:    <div class="stop-confirm" role="group" :aria-label="`Stop the agent in ${environment}`">
chat/AgentStopConfirm.vue:19:            <p class="stop-ask">{{ environment }} is working on “{{ work }}”. Stop it anyway? Its session ends.</p>
chat/AgentStopConfirm.vue:22:            <p class="stop-ask">Stop the agent in {{ environment }}? Its session ends.</p>
chat/AgentStopConfirm.vue:25:            <p class="stop-error" role="alert">{{ error }}</p>
chat/AgentStopConfirm.vue:28:            <Btn ref="cancel" small @click="emit('cancel')">Cancel</Btn>
chat/AgentStopConfirm.vue:29:            <Btn kind="danger" small :busy="busy" @click="emit('stop')">Stop</Btn>
chat/PlanCard.vue:45:    <ChatDock ref="dock" label="Plan" :kind="status" :folded="folded" :lifted="lifted">
chat/PlanCard.vue:48:            <button type="button" class="plan-card-title" title="Open plan" @click="peek('plan', plan.n)">
chat/PlanCard.vue:51:            <Chip class="plan-card-chip" :tone="status === 'ready' ? 'accent' : ''">{{ PLAN_STATES[status] }}</Chip>
chat/PlanCard.vue:66:                <Btn small @click="peek('plan', plan.n)">Open plan</Btn>
chat/PlanCard.vue:72:                    :title="building ? 'You can approve it once the plan is ready' : 'Approve the plan; the agent starts it'"
chat/PlanCard.vue:79:            <CloseButton title="Hide from chat; it stays on the Plans page" @click="api.act('plan', plan.n, 'dismiss')" />
chat/PlanCard.vue:86:                        <span class="plan-card-name">{{ ph.title }}</span>
chat/PlanCard.vue:95:                        <span class="plan-card-name">and {{ hidden }} more phase{{ hidden === 1 ? "" : "s" }}</span>
chat/PlanCard.vue:102:                        <span class="plan-card-name">{{ adding }}</span>
chat/PlanCard.vue:109:            <p class="plan-card-error">{{ error }}</p>
chat/ReportDock.vue:31:    <ChatDock ref="dock" :label="update ? 'Update report' : 'Report'" :folded="folded">
chat/ReportDock.vue:34:            <button type="button" class="report-dock-label" :title="update ? 'Open the update' : 'Open the report'" @click="open">
chat/ReportDock.vue:38:                <span class="report-dock-facts">{{ facts }}</span>
chat/ReportDock.vue:41:                <span class="report-dock-title">· {{ withoutChips(report.title) }}</span>
chat/ReportDock.vue:44:                <Btn small @click="open">{{ update ? "Open update" : "Open report" }}</Btn>
chat/ReportDock.vue:47:                title="Hide from chat; it stays on the Reports page"
chat/ReportDock.vue:52:            <button type="button" class="report-dock-lead" @click="open">{{ lead }}</button>
chat/ThreadSkeleton.vue:21:    <div class="thread-skeleton" aria-label="Loading messages">
chat/CrewList.vue:19:const recent = computed(() => props.rows.filter((r) => r.running || now.value - (r.ended || r.at || 0) <= minutes.value * 60));
chat/CrewList.vue:48:        <h4 class="crew-heading">{{ heading }}</h4>
chat/CrewList.vue:50:    <p class="crew-none">{{ summary }}</p>
chat/CrewList.vue:56:            :title="row.session ? 'Open this session' : ''"
chat/CrewList.vue:61:                <TextDisplay inline :text="row.task || row.command" />
chat/CrewList.vue:62:                <small>{{ detail(row) }}</small>
chat/CrewList.vue:64:            <small class="crew-when">{{ lasted(row) }}</small>
chat/CrewList.vue:69:                    :title="asked.has(row.task_id) ? 'The agent was asked to stop it' : 'Stop it'"
chat/DumpDock.vue:27:    <ChatDock label="Filed dump" :folded="folded">
chat/DumpDock.vue:30:            <button type="button" class="dump-dock-label" title="Open the collection" @click="open">{{ dump.title }} filed</button>
chat/DumpDock.vue:32:                <span class="dump-dock-line">· {{ line }}</span>
chat/DumpDock.vue:35:                <Btn small @click="open">Open the collection</Btn>
chat/DumpDock.vue:37:            <CloseButton title="Hide from chat; its collection stays" @click="api.act('dump', dump.n, 'dismiss')" />
chat/AgentUsage.vue:9:    <p class="bar-current">Plan allowance used</p>
chat/AgentUsage.vue:11:        <UsageMeter :label="window.label" :percent="used(window)" :note="resetLabel(window)" />
chat/AgentUsage.vue:14:        <p class="bar-none">No current plan window has been reported here.</p>
chat/DumpMadeRow.vue:56:                <p class="dump-doc-gist">{{ gist }}</p>
chat/DumpMadeRow.vue:61:                        <span class="dump-doc-label">From</span>
chat/DumpMadeRow.vue:65:                                <span class="dump-doc-chip-name">{{ from }}</span>
chat/DumpMadeRow.vue:71:                        <span class="dump-doc-label">Filed in</span>
chat/DumpMadeRow.vue:72:                        <span class="dump-doc-place">{{ made.place }}</span>
chat/DumpMadeRow.vue:77:                <TextDisplay class="dump-doc-text" :text="text" />
chat/DumpMadeRow.vue:81:            <span :class="['dump-doc-pill', {live: forming}]">{{ forming ? "Writing" : made.kind }}</span>
chat/DumpMadeRow.vue:83:                <span class="dump-doc-added" title="You did not ask for this one; the agent wrote it because it helps">
chat/DumpMadeRow.vue:84:                    Added by the agent
chat/DumpMadeRow.vue:89:                    <Btn small @click="emit('peek')">Open</Btn>
chat/DumpMadeRow.vue:90:                    <Btn small @click="renaming = true">Rename</Btn>
chat/DumpMadeRow.vue:91:                    <Btn small @click="emit('merge')">Merge</Btn>
chat/TurnMessage.vue:62:        Boolean(split.value.text) ||
chat/TurnMessage.vue:176:            <span class="thread-from">journal</span>
chat/TurnMessage.vue:180:                <TurnParent :label="commentParent.label" @open="openComment" />
chat/TurnMessage.vue:183:                <TurnPeer :label="between" />
chat/TurnMessage.vue:188:                        <p class="thread-ask-label">Question</p>
chat/TurnMessage.vue:191:                        <button type="button" class="thread-pill" :title="b.part" @click.stop="open(b.type, b.n)">
chat/TurnMessage.vue:201:                <p class="thread-ask">{{ turn.title }}</p>
chat/TurnMessage.vue:220:            :text="words.text"
chat/DumpNarration.vue:31:                <template v-if="line.mine">{{ line.text }}</template>
chat/DumpNarration.vue:34:                        <span class="dump-line-title">{{ line.text }}</span>
chat/DumpNarration.vue:38:                        <span class="dump-line-age">{{ ageOf(line.at) }}</span>
chat/DumpNarration.vue:41:                        <span class="dump-line-detail">{{ line.detail }}</span>
chat/LoopList.vue:8:    Object.entries(props.loops || {})
chat/LoopList.vue:28:    <h4 class="loop-heading">Repeating prompts</h4>
chat/LoopList.vue:29:    <p class="loop-none">Prompts the agent set to run again on a schedule.</p>
chat/LoopList.vue:32:            <span class="loop-when" :title="loop.schedule">
chat/LoopList.vue:34:                <small>{{ set(loop.at) }}</small>
chat/LoopList.vue:36:            <TextDisplay class="loop-prompt" :text="loop.prompt || ''" />
chat/AgentSkills.vue:9:    <p class="bar-none">Loaded in this window, newest last. Shortening the conversation empties it.</p>
chat/AgentSkills.vue:11:        <p class="bar-none">None — the agent is working from memory.</p>
chat/AgentSkills.vue:14:        <button type="button" class="bar-item" :title="`Read the ${s} skill`" @click="emit('read', s)">
chat/AgentSkills.vue:20:        <button type="button" class="bar-act" @click="emit('browse')">Browse every skill</button>
chat/Attachments.vue:34:                        :title="p.name"
chat/Attachments.vue:37:                        <img :src="p.url" :alt="p.name" v-bind="sized(p.name)" @load="emit('grew')" />
chat/Attachments.vue:39:                            <span class="thread-shot-more">{{ pictures.length - 4 }} more</span>
chat/Attachments.vue:47:                <a class="thread-file" :href="p.url" :title="p.name" @click.prevent="openPictures(pictures, i)">
chat/Attachments.vue:48:                    <img class="thread-image" :src="p.url" :alt="p.name" v-bind="sized(p.name)" @load="emit('grew')" />
chat/Attachments.vue:55:                <a :href="url(name)" target="_blank">{{ name }}</a>
chat/Attachments.vue:59:            <a class="thread-file" :href="url(name)" target="_blank" :title="name">
chat/MadeCard.vue:11:        <span class="thread-made-kind">{{ meta(made.type).title }} created</span>
chat/MadeCard.vue:12:        <span class="thread-made-title">{{ made.title }}</span>
chat/MadeCard.vue:14:            <TextDisplay inline class="thread-made-line" :text="made.abstract" />
chat/TerminalWindow.vue:62:                        aria-label="A command to run in the agent's terminal"
chat/TerminalWindow.vue:68:                        <span class="terminal-typed">{{ command }}</span>
chat/TerminalWindow.vue:74:                <p class="terminal-refusal">{{ refusal }}</p>
chat/DumpStart.vue:24:            <p class="dump-prompt">Throw it all in.</p>
chat/DumpStart.vue:27:                    <DumpEyebrow>The pile · {{ counted(files.length, "file", "files") }}</DumpEyebrow>
chat/DumpStart.vue:33:                    :placeholder="files.length ? 'Anything the agent should know before sorting it? Optional' : 'Type or paste anything'"
chat/DumpStart.vue:43:                        <span class="dump-error">{{ error }}</span>
chat/DumpStart.vue:46:                        Sort and file it
chat/DumpStart.vue:51:                <DumpLane title="Drop as many files as you like" meta="transcripts · notes · documents · screenshots · links">
chat/DumpStart.vue:56:                Mixed is fine. The agent sorts it by subject, one document per subject with a proper name, and files each one straight into a new
chat/DumpStart.vue:61:                    <DumpEyebrow>Earlier dumps</DumpEyebrow>
chat/DumpStart.vue:65:                                Dump {{ d.n }}
chat/DumpStart.vue:66:                                <template v-if="d.title !== `Dump ${d.n}`">· {{ d.title }}</template>
chat/TurnQuestion.vue:11:            <TextDisplay class="thread-context" :text="turn.abstract" />
chat/AgentControls.vue:50:        <p class="bar-error">{{ error }}</p>
chat/AgentControls.vue:53:        <p class="bar-current">Context window</p>
chat/AgentControls.vue:54:        <UsageMeter label="Used" :percent="filled" :note="compacted" />
chat/AgentControls.vue:57:        <p class="bar-current">{{ current }}</p>
chat/AgentControls.vue:61:            <span>{{ pending(control) }} is waiting for the agent to finish its turn.</span>
chat/AgentControls.vue:66:            <p class="bar-label">{{ group.label }}</p>
chat/AgentControls.vue:76:        <p class="bar-none">{{ controls.note }}</p>
chat/AgentAppoint.vue:36:        <p class="bar-error">{{ error }}</p>
chat/AgentAppoint.vue:39:        <p class="bar-none">No online agents are available.</p>
chat/AgentAppoint.vue:44:            <span>{{ providerName(candidate.provider, "Agent") }}{{ candidate.model ? ` · ${candidate.model}` : "" }}</span>
chat/AgentAppoint.vue:45:            <small>{{ candidate.environment || "unassigned" }}</small>
chat/TurnPeer.vue:8:    <BubbleHeader icon="agents" :label="label" tone="muted" small />
chat/TurnActions.vue:35:                    <button type="button" class="thread-face-pick" :title="`React ${f}`" @click.stop="react(f)">{{ f }}</button>
chat/TurnActions.vue:38:            <button type="button" class="thread-tool" title="Cancel" @click.stop="emit('update:picking', false)">
chat/TurnActions.vue:43:            <button type="button" class="thread-tool" title="React to this" @click.stop="emit('update:picking', true)">React</button>
chat/TurnActions.vue:45:            <button type="button" class="thread-tool" title="Pin this over the chat" @click.stop="emit('pin', {text, ref: turn.ref})">
chat/TurnActions.vue:48:            <button type="button" class="thread-tool" title="Copy the text of this" @click.stop="copy">
chat/TurnActions.vue:55:                    title="Delete. It leaves the list but stays in the history."
chat/TurnHeader.vue:14:            <span>sending</span>
chat/TurnHeader.vue:17:            <span class="thread-ref">{{ turn.type }} {{ turn.n }}</span>
chat/TurnHeader.vue:21:            <span>from phone</span>
chat/TurnHeader.vue:25:            <span>{{ clock(turn.created) }}</span>
chat/DumpPill.vue:27:    <span :class="['dump-pill', TONES[phase]]">{{ PILLS[phase] }}</span>
chat/DumpFoot.vue:23:                    Remove the collection and the {{ counted(filed, "thing", "things") }} in it? What you dropped is not touched.
chat/DumpFoot.vue:25:                <Btn small @click="confirming = ''">Keep the collection</Btn>
chat/DumpFoot.vue:26:                <Btn kind="danger" small @click="emit('confirmed')">Remove the collection</Btn>
chat/DumpFoot.vue:29:                <span class="dump-confirm">Stop filing? What is filed stays; the rest of the pile is not read.</span>
chat/DumpFoot.vue:30:                <Btn small @click="confirming = ''">Keep filing</Btn>
chat/DumpFoot.vue:31:                <Btn kind="danger" small @click="emit('confirmed')">Stop</Btn>
chat/DumpFoot.vue:35:                <span class="dump-foot-label">Collection</span>
chat/DumpFoot.vue:36:                <span class="dump-foot-name">{{ collection || (removed ? "Removed" : "Not named yet") }}</span>
chat/DumpFoot.vue:37:                <span class="dump-foot-label">· {{ counted(filed, "thing", "things") }}</span>
chat/DumpFoot.vue:40:                    <Btn small @click="confirming = 'stop'">Stop filing</Btn>
chat/DumpFoot.vue:43:                    <Btn small :disabled="!filed && working" @click="confirming = 'remove'">Remove the collection</Btn>
chat/QuestionOverlay.vue:52:    Object.assign(box.style, {width: `${r.width}px`, height: `${r.height}px`, overflow: "hidden"});
chat/QuestionOverlay.vue:106:            <section ref="card" class="question-card" role="dialog" aria-label="Question">
chat/QuestionOverlay.vue:108:                    <p class="question-label">Question</p>
chat/QuestionOverlay.vue:109:                    <h3 class="question-title">{{ current.title }}</h3>
chat/QuestionOverlay.vue:111:                        <TextDisplay class="question-context" :text="current.abstract" />
chat/AgentBarViews.vue:28:            <button type="button" class="agent-away" title="Open in another tab; click to bring it back here" @click="views.back(x.id)">
chat/AgentBarViews.vue:55:            title="Layout presets"
chat/AgentBarViews.vue:69:                    :title="p.title"
chat/HelperRow.vue:48:            <Btn kind="text" class="helper-what" title="Open this helper's inspector" @click="emit('inspect')">
chat/HelperRow.vue:49:                <strong class="helper-name">{{ name() }}</strong>
chat/HelperRow.vue:50:                <span class="helper-job" :title="row.title">{{ row.title }}</span>
chat/HelperRow.vue:51:                <small>{{ helperLine(row) }}</small>
chat/HelperRow.vue:54:                <span :class="['helper-state', state()]">{{ stateLabel() }}</span>
chat/HelperRow.vue:58:                        label="Stop its agent"
chat/HelperRow.vue:68:            <TextDisplay ref="reportBox" :class="['helper-report', {whole}]" :text="report()" :style="{'--lines': LINES}" />
chat/HelperRow.vue:79:                        Remove the environment of {{ name() }} and its working copy of the code? Its report stays here under Closed, and the
chat/HelperRow.vue:83:                        <Btn small @click="confirming = false">Cancel</Btn>
chat/HelperRow.vue:84:                        <Btn small kind="danger" :busy="busy" @click="remove">Remove</Btn>
chat/HelperRow.vue:89:                <Btn small class="helper-remove" @click="confirming = true">Remove the helper and its worktree</Btn>
chat/HelperRow.vue:93:            <p class="helper-refusal">{{ refusal }}</p>
chat/DumpHead.vue:17:            <span class="dump-title">Dump {{ dump.n }}</span>
chat/DumpHead.vue:22:                <button type="button" class="dump-collection" title="Rename the collection" @click="renaming = true">
chat/DumpHead.vue:23:                    <span class="dump-collection-name">{{ collection }}</span>
chat/DumpHead.vue:30:            <span class="dump-title">New dump</span>
chat/DumpHead.vue:34:            <Btn small @click="store.dumpSelected = 0">New dump</Btn>
chat/DumpHead.vue:36:        <Btn small @click="store.dumping = false">Back to chat</Btn>
chat/AgentMenu.vue:37:            Open the agent's page
chat/AgentMenu.vue:41:            Stop the agent
chat/DumpWindow.vue:183:    () => phase.value === "done" && !summary.value && !options.value.length && now.value - dump.value.completed < SUMMING_FOR
chat/DumpWindow.vue:286:        Object.assign(draft, {text: "", files: []});
chat/DumpWindow.vue:370:                v-model:text="draft.text"
chat/DumpWindow.vue:405:                    <p class="dump-note">{{ note }}</p>
chat/DumpWindow.vue:409:                                :title="reportTitle"
chat/DumpWindow.vue:436:                            <template v-if="merging.size < 2">1 selected. Select one more to merge.</template>
chat/DumpWindow.vue:439:                                <Btn kind="primary" small @click="merge">Merge into one document</Btn>
chat/DumpWindow.vue:441:                            <Btn small @click="merging = null">Cancel</Btn>
chat/DumpWindow.vue:461:                    title="Let go to add them to the pile"
chat/TurnReactions.vue:9:            <button type="button" :class="['thread-face', {mine: f.mine}]" :title="f.title" @click.stop="emit('react', f.face)">
chat/PinsToggle.vue:14:            :title="minimised ? 'Show the pinned links' : 'Shrink the pinned links to this corner'"
chat/PinsToggle.vue:19:                <span class="pins-count">{{ pins.length }}</span>
chat/CommandLog.vue:21:                <span class="log-mark">{{ MARKS[c.tool] || "›" }}</span>
chat/CommandLog.vue:22:                <span class="log-text">{{ c.command }}</span>
chat/CommandLog.vue:27:                    :title="opened.has(c.at) ? 'Click to fold the output' : 'Click to show the whole output'"
chat/CommandLog.vue:29:                    >{{ c.output }}</pre>
chat/CommandLog.vue:33:            <div class="log-line shell queued" title="Waiting to be typed into the agent's terminal">
chat/CommandLog.vue:35:                <span class="log-text">{{ q.command }}</span>
chat/CommandLog.vue:36:                <span class="log-state">pending</span>
chat/CommandLog.vue:37:                <button type="button" class="log-now" title="Interrupt the agent and run this command now" @click="emit('now', q.command)">
chat/CommandLog.vue:38:                    Run now · {{ MOD }} Enter
chat/DumpReport.vue:19:        <p class="dump-report-title">{{ title }}</p>
chat/DumpReport.vue:27:            <TextDisplay class="dump-report-summary" :text="summary" />
chat/DumpReport.vue:30:            <p class="dump-report-note">Writing a summary of what was filed…</p>
chat/DumpReport.vue:33:            <p class="dump-report-note">Nothing was planned or started. Ask about any of it in the pile on the left.</p>
chat/DumpReport.vue:37:                <span class="dump-report-ask">{{ s.ask || s.label }}</span>
chat/DumpReport.vue:46:                        <span class="dump-report-left">Not now</span>
chat/DumpReport.vue:50:                            <Btn kind="primary" small :busy="s.busy" @click="emit('take', s.pick)">{{ s.ask ? s.label : "Yes, do it" }}</Btn>
chat/DumpReport.vue:51:                            <Btn small @click="emit('leave', s.pick)">Not now</Btn>
chat/AgentPresets.vue:33:                Color schemes
chat/AgentPresets.vue:40:                Color schemes
chat/UpdateOverlay.vue:37:    Object.assign(copy.style, {margin: "0", width: "100%", height: "100%", maxWidth: "none", visibility: "visible"});
chat/UpdateOverlay.vue:39:    Object.assign(ghost.value.style, cardAt(el).box);
chat/UpdateOverlay.vue:143:    <section ref="layer" class="update-layer" aria-label="Update report">
chat/UpdateOverlay.vue:149:                        <button type="button" class="to-panel" title="Open in the side panel" @click="toPanel">
chat/SubagentChat.vue:47:                <p class="none">Nothing said yet.</p>
chat/SubagentChat.vue:52:                <Compose :send="send" :placeholder="task ? `Message ${task}` : 'Message the subagent'" />
chat/AgentStopButton.vue:34:            :title="`Stop the agent in ${environment}; it ends its session`"
chat/AgentStopButton.vue:39:            <template v-if="quiet">{{ label }}</template>
chat/UsageMeter.vue:11:        <span>{{ label }}</span>
chat/UsageMeter.vue:12:        <strong>{{ Math.round(percent) }}%</strong>
chat/UsageMeter.vue:14:        <small>{{ note }}</small>
chat/TurnThought.vue:15:        <TextDisplay class="thought-text" :text="turn.title" />
chat/TurnThought.vue:17:            <ReplyTool title="Reply to this thought, quoting it" @reply="emit('reply', {text: words.text, ref: turn.ref})" />
chat/Thread.vue:135:const sizeWatch = new ResizeObserver(([entry]) => (short.value = entry.contentRect.height < SHORT_CHAT));
chat/Thread.vue:287:    if (e.deltaY > 0 && s && s.scrollHeight - s.scrollTop - s.clientHeight <= AT_BOTTOM) settlePlan(true);
chat/Thread.vue:446:                        :title="missed ? `${missed} arrived while you were reading` : 'Back to the newest'"
chat/Thread.vue:455:                        <span class="thread-answering-label">Editing message {{ editing.n }}</span>
chat/Thread.vue:456:                        <span class="thread-answering-text">{{ editing.text }}</span>
chat/Thread.vue:457:                        <button type="button" class="thread-answering-x" title="Leave it as it was (Esc)" @click="unedit">×</button>
chat/Thread.vue:463:                    quote-label="Replying to"
chat/Thread.vue:489:                            <p class="thread-empty">Nothing has been said here yet.</p>
chat/Thread.vue:517:                                :aria-label="waiting ? `The agent is waiting ${waiting}` : `The agent is ${activity}`"
chat/Thread.vue:522:                                        <span>thinking</span>
chat/Thread.vue:523:                                        <span class="thread-meta-on thought">{{ thought }}</span>
chat/AgentFacts.vue:58:                :title="unlessDemo('')"
chat/AgentFacts.vue:62:                Assign agent
chat/AgentFacts.vue:69:                :title="`Session ${agent.title}: open its page or stop it`"
chat/AgentFacts.vue:79:                    :title="usage.length ? `${usageLabel} plan allowance used` : `Open ${name} usage`"
chat/AgentFacts.vue:108:                    :title="pending('model') ? `${pending('model')} — waiting for the agent` : `${data.model} — change model`"
chat/AgentFacts.vue:137:                :title="skillCount.title"
chat/AgentFacts.vue:143:            <AgentFact class="agent-fact" tag="span" icon="reminders" title="how long this session has run">
chat/AgentFacts.vue:150:                    :title="c.title"
chat/AgentFacts.vue:175:                    title="the branch it works on — open it in the repository"
chat/AgentFacts.vue:181:                <AgentFact class="agent-fact" tag="span" icon="branch" title="the branch it works on">
chat/HelperList.vue:35:                <h4 class="helpers-heading">Helpers</h4>
chat/HelperList.vue:36:                <span class="helpers-counts">{{ countsLine }}</span>
chat/HelperList.vue:42:                <p class="helpers-none">No helpers have been started here.</p>
chat/HelperList.vue:48:                <FoldGroup flush label="Closed" :count="grouped.closed.length" :open="closedOpen" @toggle="closedOpen = !closedOpen">
chat/HelperList.vue:60:                :label="helperName(inspected)"
chat/Turn.vue:61:                <WhisperMark v-bind="data" :title="turn.title" :at="turn.created" />
chat/FileFeed.vue:116:            <EmptyState title="No edits yet">The agent's file edits appear here as it makes them.</EmptyState>
chat/DumpAnswer.vue:28:        <TextInput class="dump-answer-field" :value="text" :placeholder="placeholder" @input="text = $event.target.value">
chat/DumpAnswer.vue:30:                <button type="submit" class="dump-answer-send" :title="action" :aria-label="action" :disabled="sending || !text.trim()">
chat/TurnParent.vue:9:    <BubbleHeader icon="bubble" :label="`Comment on ${label}`" tone="blocking" clickable @click="emit('open')" />
chat/DumpRail.vue:40:        <DumpEyebrow>The pile</DumpEyebrow>
chat/DumpRail.vue:50:                    :title="item.note"
chat/DumpRail.vue:59:            <DumpAddFiles class="dump-add-more" @files="(list) => emit('more', list)">Add more files</DumpAddFiles>
chat/DumpRail.vue:62:            <span class="dump-error">{{ moreError }}</span>
chat/DumpRail.vue:65:        <DumpEyebrow>What the agent is doing</DumpEyebrow>
chat/DumpRail.vue:69:                <p class="dump-ask-q">{{ question }}</p>
chat/DumpRail.vue:77:                <DumpAnswer :placeholder="guesses.length ? 'Or say it in your own words' : 'Your answer'" :send="answer" />
chat/DumpRail.vue:82:                :placeholder="working ? 'Ask, or paste more files' : 'Ask about what was filed'"
chat/RunningCommand.vue:50:                <TransitionGroup tag="span" name="token" class="running-text" :title="runningLine.text">
chat/RunningCommand.vue:52:                        <template v-if="part.increments">{{ amount(part) }}</template>
chat/RunningCommand.vue:53:                        <template v-else>{{ part.value }}</template>
chat/RunningCommand.vue:58:                        <span v-if="runningLine.clock" class="running-for">{{ runningLine.clock }}</span>
chat/RunningCommand.vue:64:            <span class="running-idle">{{ idle }}</span>
board/ShiftPrompt.vue:23:    <Dialog :title="question.title" fits @close="emit('close')">
board/ShiftPrompt.vue:24:        <p class="card">#{{ ask.card.n }} {{ ask.card.title }}</p>
board/ShiftPrompt.vue:29:            :placeholder="question.required ? 'A few words' : 'A few words, or leave it empty'"
board/ShiftPrompt.vue:34:            <Btn small @click="emit('close')">Cancel</Btn>
board/ShiftPrompt.vue:35:            <Btn kind="primary" small :disabled="!ready" @click="send">Move it</Btn>
board/NewWorkHead.vue:19:            New work
board/NewWorkHead.vue:20:            <span class="head-board">{{ title }}</span>
board/NewWorkHead.vue:22:        <Btn small @click="emit('cancel')">Cancel</Btn>
board/NewWorkHead.vue:38:    <p class="announce" aria-live="polite">{{ summary.text }}</p>
board/Card.vue:121:            <span class="title">{{ card.title }}</span>
board/Card.vue:127:                <button ref="opener" type="button" class="more" title="Move, assign or open" @click.stop="menu = !menu">
board/Card.vue:136:                    <span class="reason">{{ card.reason }}</span>
board/Card.vue:139:                    <button type="button" class="watch" @click.stop="board.openAgent(card)">Open agent</button>
board/Card.vue:142:                    <a class="app" :href="card.link" target="_blank" rel="noopener" @click.stop>{{ card.link_label }} ↗</a>
board/Card.vue:145:                    <span class="app">{{ card.link_label }}</span>
board/Card.vue:157:                <Chip tone="accent">{{ titleOf(name) }}</Chip>
board/Card.vue:160:                <Chip>paused</Chip>
board/Card.vue:163:                <Chip>Reported</Chip>
board/Card.vue:166:                <Chip tone="danger" title="A question waits on you" @click.stop="peek('question', card.question)">!</Chip>
board/Card.vue:173:                        <a class="action-link" :href="action.href" target="_blank" rel="noopener" @click.stop>{{ action.label }} ↗</a>
board/Card.vue:176:                        <Btn small :kind="i ? 'ghost' : 'primary'" @click.stop="act(action)">{{ action.label }}</Btn>
board/Card.vue:182:            <Chip @click.stop="peek('plan', plan.n)">Plan {{ plan.n }} · phase {{ plan.phase }}</Chip>
board/Card.vue:185:            <Chip @click.stop="peekThere(ticketPlan.env, 'plan', ticketPlan.n)">Plan {{ ticketPlan.n }}</Chip>
board/DocumentChoice.vue:25:                    From a document
board/DocumentChoice.vue:27:                        <span class="document-choice-key">{{ shortcut }}</span>
board/DocumentChoice.vue:32:                        The agent reads it, chooses the stages and fills them with tickets. A roadmap, a spec, a plan or meeting notes.
board/DocumentChoice.vue:38:                    <Btn small @click.stop="browse">Choose a document</Btn>
board/DocumentChoice.vue:48:                label="Anything to know?"
board/DocumentChoice.vue:49:                placeholder="Keep stages simple, five at most"
board/BoardMenu.vue:20:            New board
board/BoardMenu.vue:23:            <SectionHeading class="heading apart">{{ board.title }}</SectionHeading>
board/BoardMenu.vue:24:            <MenuItem @click="(emit('close'), peek('board', board.n))">Board settings</MenuItem>
board/BoardMenu.vue:25:            <MenuItem @click="emit('archive', board)">Archive this board</MenuItem>
board/BoardMenu.vue:29:                <SectionHeading class="heading">Archived boards</SectionHeading>
board/BoardMenu.vue:33:                        <span class="name">{{ archivedBoard.title }}</span>
board/BoardMenu.vue:34:                        <span class="restore">Restore</span>
board/Lane.vue:49:        <header class="head" :title="MEANING_LABELS[meaning]">
board/Lane.vue:51:            <span class="title">{{ lane.title }}</span>
board/Lane.vue:52:            <span class="meaning">{{ meaningLabel }}</span>
board/Lane.vue:54:                <Btn small :busy="accepting" title="Take every wait the agent proposed in this column" @click="acceptAll">
board/Lane.vue:55:                    Accept all suggestions in this column
board/Lane.vue:58:            <span class="count">{{ loading ? "" : lane.cards.length }}</span>
board/Lane.vue:74:                    <PlaceholderCard :title="`New work in ${lane.title}`" @click="board.newWork(lane.key)">+ New work</PlaceholderCard>
board/Lane.vue:77:                    <p class="none">No cards</p>
board/BoardRolesPanel.vue:16:            <span class="board-roles-heading">Working now</span>
board/BoardRolesPanel.vue:19:                    <span class="board-roles-work-title">{{ chip.title }}</span>
board/BoardRolesPanel.vue:20:                    <span class="board-roles-cards">#{{ chip.n }}</span>
board/BoardRolesPanel.vue:22:                        <a :href="href.page(chip.env)">Open chat</a>
board/BoardRolesPanel.vue:27:        <span class="board-roles-heading">All roles</span>
board/BoardRolesPanel.vue:30:                :label="domain.title"
board/BoardRolesPanel.vue:39:                        <span class="board-roles-cards">{{ role.cards }}</span>
board/BoardRolesPanel.vue:44:        <a class="board-roles-organization" :href="organization">Open the Organization page</a>
board/NotePrompt.vue:15:        <p class="text">A note for its agent. It is typed into the agent's terminal as your next message.</p>
board/NotePrompt.vue:19:            placeholder="What should change"
board/NotePrompt.vue:25:            <Btn small @click="emit('close')">Cancel</Btn>
board/NotePrompt.vue:26:            <Btn kind="primary" small :disabled="!note.trim()" @click="send">{{ ask.action.label }}</Btn>
board/Suggestion.vue:112:        :title="progress.done ? 'Click to pick it; double-click its title or description to change them' : ''"
board/Suggestion.vue:131:                        :text="field.text"
board/Suggestion.vue:143:                <span class="owner">For {{ owner }}</span>
board/Suggestion.vue:147:            <span class="covers" :title="`Done when: ${covers}`">Done when: {{ covers }}</span>
board/Suggestion.vue:150:            <span class="origin" :title="`From ${ticket.data.source}`">{{ origin }}</span>
board/Suggestion.vue:154:                More info
board/BoardRoles.vue:16:const small = computed(() => props.roles.length <= SMALL);
board/BoardRoles.vue:46:    <section class="board-roles" aria-label="Roles at work">
board/BoardRoles.vue:47:        <span class="board-roles-label">Roles</span>
board/BoardRoles.vue:54:                    <BoardRoleChip :title="chip.title" :n="chip.n" />
board/BoardRoles.vue:58:                <span class="board-roles-quiet">No role is working right now</span>
board/BoardRoles.vue:61:                <BoardRoleChip :title="chip.title" :n="chip.n" :task="chip.task" :env="chip.env" />
board/BoardRoles.vue:64:                <button type="button" class="board-roles-button" @click.stop="show">+{{ hidden }} more working</button>
board/BoardRoles.vue:76:            <a class="board-roles-button" :href="organization">Organization</a>
board/BoardRoles.vue:85:                All {{ roles.length }} roles
board/TodoBoard.vue:64:            <p>Nothing is on the list.</p>
board/TodoBoard.vue:65:            <Btn kind="primary" small @click="newWork">New to-do</Btn>
board/TodoBoard.vue:70:            <Btn :class="['plan', {on: !chosenPlan}]" @click="lens({plan: 0})">All to-dos</Btn>
board/TodoBoard.vue:72:                <Btn :class="['plan', {on: chosenPlan === plan.n}]" @click="lens({plan: plan.n})">Plan {{ plan.n }}</Btn>
board/ReadingLine.vue:10:        <div :key="summaryKey" class="reading" :title="summary.text">
board/ReadingLine.vue:12:                <span class="reading-text">{{ summary.text }}</span>
board/ReadingLine.vue:15:                <span class="reading-text quiet">The agent will say here what it thinks you mean.</span>
board/ReadingLine.vue:17:            <span class="reading-step">{{ summary.step }}</span>
board/DraftDetail.vue:28:            <h3 class="title">{{ ticket.title }}</h3>
board/DraftDetail.vue:29:            <p class="line">{{ ticket.abstract }}</p>
board/DraftDetail.vue:32:            <h3 class="title">{{ ticket.title }}</h3>
board/DraftDetail.vue:34:                <p class="approval">Waits for your approval before it starts</p>
board/DraftDetail.vue:36:            <TextDisplay class="brief" :text="ticket.brief" />
board/DraftDetail.vue:39:            <Btn :kind="picked ? 'ghost' : 'primary'" small :title="picked ? 'Click to unpick it' : ''" @click="keep">
board/StopPrompt.vue:10:    <Dialog :title="`Stop #${move.card.n}'s agent?`" fits @close="emit('close')">
board/StopPrompt.vue:11:        <p class="text">It is working on {{ move.card.title }}. Its branch and its changes stay either way.</p>
board/StopPrompt.vue:13:            <Btn small @click="emit('close')">Cancel</Btn>
board/StopPrompt.vue:14:            <Btn small @click="emit('keep')">Move, keep it working</Btn>
board/StopPrompt.vue:15:            <Btn kind="primary" small @click="emit('stop')">Stop its agent and move</Btn>
board/GoalPoints.vue:7:        <p class="goal-whole">{{ goal }}</p>
board/GoalPoints.vue:12:                <li>{{ point }}</li>
board/NewWorkBar.vue:21:            <span class="note-main">{{ note }}</span>
board/NewWorkBar.vue:26:        <Btn small :disabled="!redraftable" @click="emit('again')">Ask for a different set</Btn>
board/BuildStrip.vue:35:            <PageThumb :lines="done ? 7 : 3" :label="extension" :fresh="!done" />
board/BuildStrip.vue:38:                    <span class="build-strip-line">Built from {{ building.document }}. {{ building.summary }}</span>
board/BuildStrip.vue:41:                    <span class="build-strip-line">{{ latest }}</span>
board/BuildStrip.vue:42:                    <span class="build-strip-meta">{{ building.document }} · {{ counted }}</span>
board/BuildStrip.vue:47:                <Btn small @click="listing = !listing">{{ listing ? "Hide steps" : "What the agent did" }}</Btn>
board/BuildStrip.vue:50:                <Btn small :disabled="busy" @click="act('discard')">Remove this board</Btn>
board/BuildStrip.vue:51:                <Btn kind="primary" small :disabled="busy" @click="act('keep')">Keep the board</Btn>
board/BuildStrip.vue:54:                <Btn small :disabled="busy" title="Stops the agent and removes the board" @click="act('discard')">Cancel</Btn>
board/BuildStrip.vue:60:                    <li>{{ entry.text }}</li>
board/NewWork.vue:182:    Object.entries(ticket.data.dependencies || {})
board/NewWork.vue:496:                    <ChatPanel ref="panel" v-model="words" :locked="adding || added > 0" :placeholder="placeholder" @send="send">
board/NewWork.vue:499:                                :title="board.title"
board/NewWork.vue:513:                                <ChatLine :kind="line.kind" :text="line.text" />
board/NewWork.vue:516:                                <ChatLine :text="line.text" :mine="line.mine" :typed="Boolean(line.typed) && line.at > openedAt" />
board/NewWork.vue:522:                                    text="The agent still does not understand the request. Start over: say it again in other words, or give me an example."
board/NewWork.vue:526:                                    Start over
board/NewWork.vue:551:                                <Btn small title="Draft tickets from a document" @click="picker.click()">
board/NewWork.vue:559:                <section class="pane" aria-label="Drafts">
board/NewWork.vue:561:                        :note="note"
board/NewWork.vue:568:                        :add-label="addLabel"
board/NewWork.vue:608:                                <p class="empty">No tickets came out of this. Say more in the chat, or ask for a different set.</p>
board/RoleCard.vue:11:            <span class="title">{{ role.title || role.name }}</span>
board/RoleCard.vue:13:                <Chip>Leads the domain</Chip>
board/RoleCard.vue:17:            <p class="description">{{ role.description }}</p>
board/RoleCard.vue:21:                <dt>Does</dt>
board/RoleCard.vue:22:                <dd>{{ role.responsible }}</dd>
board/RoleCard.vue:25:                <dt>Leaves to others</dt>
board/RoleCard.vue:26:                <dd>{{ role.not_responsible }}</dd>
board/RoleCard.vue:29:                <dt>Needs</dt>
board/RoleCard.vue:30:                <dd>{{ role.inputs.join(", ") }}</dd>
board/RoleCard.vue:33:                <dt>Hands back</dt>
board/RoleCard.vue:34:                <dd>{{ role.outputs.join(", ") }}</dd>
board/RoleCard.vue:37:                <dt>Skills</dt>
board/RoleCard.vue:38:                <dd>{{ role.skills.join(", ") }}</dd>
board/RoleCard.vue:41:                <dt>Tools</dt>
board/RoleCard.vue:42:                <dd>{{ role.tools.join(", ") }}</dd>
board/RoleCard.vue:46:            <span>{{ CARDINALITY[role.cardinality] || role.cardinality }}</span>
board/RoleCard.vue:48:                <span>· {{ role.model }}</span>
board/DocumentOutline.vue:18:                    <span :key="section.state" class="mark">{{ MARKS[section.state] ?? "·" }}</span>
board/DocumentOutline.vue:20:                <span class="title">{{ section.title }}</span>
board/DocumentOutline.vue:21:                <span class="count">{{ count(section) }}</span>
board/BoardGoal.vue:19:            <span class="board-goal-label">Goal</span>
board/BoardGoal.vue:20:            <button type="button" class="board-goal-text" :aria-expanded="open" @click="open = !open">{{ goal || "Done when" }}</button>
