${escapeHtml(task.title ?? 'Untitled task')}
${escapeHtml(detail || 'No task description recorded.')}
Task reference
${escapeHtml(task.id)}${escapeHtml(staleEvidence.recommendation)}
Acceptance criteria
- ${acceptance}
const consoleViewDefinitions = Object.freeze({ overview: { title: 'Overview' }, 'owner-briefing': { title: 'Briefing' }, 'flow-watch': { title: 'Flow watch' }, work: { title: 'Work' }, 'initiative-progress': { title: 'Progress' }, fleet: { title: 'Fleet' }, communications: { title: 'Conversations' }, organization: { title: 'Organization' }, evidence: { title: 'Evidence' }, delivery: { title: 'Release gates' }, }); function installConsoleViewRouting() { const nav = document.querySelector('.console-rail'); const sections = [...document.querySelectorAll('.console-workspace > [data-console-view]')]; const links = [...(nav?.querySelectorAll('a[href^="#"]') ?? [])]; if (!nav || !sections.length || !links.length) return { sync: () => 'overview' }; let lastHash = null; const initialHash = globalThis.location.hash; const decodeHash = (hash) => { try { return decodeURIComponent(String(hash ?? '').replace(/^#/, '')); } catch { return ''; } }; function resolveView(hash) { const fragment = decodeHash(hash); if (consoleViewDefinitions[fragment]) return fragment; const target = document.getElementById(fragment); const containingView = target?.closest('[data-console-view]')?.dataset.consoleView; return consoleViewDefinitions[containingView] ? containingView : 'overview'; } function accountForStickyNavigation(target) { const workspace = document.querySelector('.console-workspace'); if (!workspace || !target) return; const railBounds = nav.getBoundingClientRect(); const workspaceBounds = workspace.getBoundingClientRect(); const overlapsWorkspace = railBounds.right > workspaceBounds.left + 1 && workspaceBounds.right > railBounds.left + 1; if (overlapsWorkspace) { target.style.scrollMarginTop = `${Math.ceil(railBounds.height + 8)}px`; } else { target.style.removeProperty('scroll-margin-top'); } } function positionNestedTarget(target, targetId, view) { const targetView = target?.closest('[data-console-view]')?.dataset.consoleView; if (!target || targetId === view || targetView !== view) return; for (let ancestor = target; ancestor; ancestor = ancestor.parentElement) { if (ancestor instanceof HTMLDetailsElement) ancestor.open = true; } accountForStickyNavigation(target); if (!target.hasAttribute('tabindex') && !target.matches('a[href], button, input, select, textarea, summary')) { target.tabIndex = -1; } target.scrollIntoView?.({ block: 'start', behavior: 'instant' }); target.focus?.({ preventScroll: true }); } const initialFragment = decodeHash(initialHash); let initialPositionPending = Boolean(initialFragment && !consoleViewDefinitions[initialFragment] && document.getElementById(initialFragment)); let userIntentVersion = 0; const abandonInitialPosition = () => { initialPositionPending = false; userIntentVersion += 1; }; const onNavigation = () => { abandonInitialPosition(); sync({ focus: true }); }; function sync({ focus = false, force = false } = {}) { const hash = globalThis.location.hash || '#overview'; if (!force && hash === lastHash) return resolveView(hash); lastHash = hash; const view = resolveView(hash); const definition = consoleViewDefinitions[view]; const visible = sections.filter((section) => section.dataset.consoleView === view); sections.forEach((section) => { section.hidden = section.dataset.consoleView !== view; }); links.forEach((link) => { const route = resolveView(link.getAttribute('href')); if (route === view) link.setAttribute('aria-current', 'page'); else link.removeAttribute('aria-current'); }); const workspace = document.querySelector('.console-workspace'); if (workspace) workspace.dataset.currentView = view; document.title = view === 'overview' ? 'TORCH Dashboard' : `${definition.title} | TORCH Local Fleet Console`; const announcement = document.querySelector('#console-view-status'); if (announcement) announcement.textContent = `Viewing ${definition.title}.`; if (focus) { const targetId = decodeHash(hash); const target = document.getElementById(targetId); const targetView = target?.closest('[data-console-view]')?.dataset.consoleView; if (target && targetId !== view && targetView === view) { positionNestedTarget(target, targetId, view); } else { const labelledBy = visible[0]?.getAttribute('aria-labelledby'); const heading = (labelledBy && document.getElementById(labelledBy)) ?? visible[0]?.querySelector('h1, h2'); if (heading) { heading.tabIndex = -1; heading.focus({ preventScroll: true }); } if (target && targetId === view && targetView === view) { accountForStickyNavigation(target); target.scrollIntoView?.({ block: 'start', behavior: 'instant' }); } else { globalThis.scrollTo?.({ top: 0, behavior: 'instant' }); } } } return view; } globalThis.addEventListener('hashchange', onNavigation); globalThis.addEventListener('popstate', onNavigation); globalThis.addEventListener('wheel', abandonInitialPosition, { passive: true }); globalThis.addEventListener('touchstart', abandonInitialPosition, { passive: true }); globalThis.addEventListener('pointerdown', abandonInitialPosition, { passive: true }); globalThis.addEventListener('keydown', (event) => { if (['ArrowDown', 'ArrowUp', 'PageDown', 'PageUp', 'Home', 'End', ' '].includes(event.key)) { abandonInitialPosition(); } }); sync({ focus: Boolean(initialFragment && !consoleViewDefinitions[initialFragment]) }); return { sync, afterInitialLayout() { if (!initialPositionPending) return; initialPositionPending = false; if (globalThis.location.hash !== initialHash) return; const targetId = decodeHash(initialHash); const view = resolveView(initialHash); positionNestedTarget(document.getElementById(targetId), targetId, view); }, userIntentVersion: () => userIntentVersion, }; } const $ = (selector) => document.querySelector(selector); const consoleViewRouter = installConsoleViewRouting(); const demoWorkspace = globalThis.TorchConsoleDemo; const workViews = globalThis.TorchWorkViews; const workProgress = globalThis.TorchWorkProgress; const emptyWorkFilters = workViews?.emptyFilters() ?? { query: '', owner: '', state: '', priority: '', domain: '' }; const workViewState = { initialized: false, key: null, storage: null, views: [], selectedId: '', warning: null }; let runtimeProfileAgents = []; let runtimeProfileAdapters = []; let currentBacklog = []; let currentBacklogHealth = []; const refreshProtection = globalThis.TorchLiveRefresh.createProtection(document); refreshProtection.remember(); let renderingSnapshot = false; let heldPanels = 0; function invalidateStalePriorityPreviews(tasks = []) { const currentById = new Map(tasks.map((task) => [task.id, task])); for (const form of document.querySelectorAll('.priority-change-form[data-preview-token]')) { const task = currentById.get(form.dataset.taskId); const currentRevision = Number(task?.revision); const previewRevision = Number(form.dataset.revision); if (!task || !Number.isSafeInteger(currentRevision) || currentRevision === previewRevision) continue; const ticket = form.closest('.task-ticket'); if (!ticket) continue; const priority = task.priority ?? 'normal'; const priorityBadge = ticket.querySelector('.ticket-topline .priority'); if (priorityBadge) { priorityBadge.className = `priority priority-${escapeHtml(priority)}`; priorityBadge.textContent = priority; } form.dataset.revision = String(currentRevision); delete form.dataset.previewToken; delete form.dataset.planHash; const priorityField = form.querySelector('[name="priority"]'); const reasonField = form.querySelector('[name="reason"]'); if (priorityField) priorityField.disabled = false; if (reasonField) reasonField.disabled = false; const preview = form.querySelector('[data-priority-preview]'); if (preview) { preview.replaceChildren(); preview.hidden = true; } priorityStatus(form, `Task evidence advanced to revision ${currentRevision}. The older preview was cleared; review the current task before previewing again.`); } } const escapeHtml = (value) => { const element = document.createElement('span'); element.textContent = value ?? ''; return element.innerHTML; }; function localPath(value) { const path = String(value ?? ''); return path.startsWith('/') && !path.startsWith('//') ? escapeHtml(path) : ''; } function empty(message) { return `
${escapeHtml(message)}
`; } function setHtml(selector, content) { const element = $(selector); if (renderingSnapshot && refreshProtection.protects(element)) { heldPanels += 1; return; } if (element) { const open = new Set([...element.querySelectorAll('details[open]')].map((details) => details.querySelector(':scope > summary')?.textContent)); element.innerHTML = content; element.querySelectorAll('details').forEach((details) => { if (open.has(details.querySelector(':scope > summary')?.textContent)) details.open = true; }); } } function setText(selector, value) { const element = $(selector); if (element) element.textContent = value ?? ''; } function compactOwnerBriefingProvenance() { const publication = $('#owner-briefing-content')?.querySelector('.briefing-publication'); if (!publication) return; const timestamp = publication.querySelector('p time'); const window = [...publication.querySelectorAll('.briefing-muted')] .find((paragraph) => paragraph.textContent.trim().startsWith('Window:')); if (timestamp || window) { const disclosure = document.createElement('details'); disclosure.className = 'briefing-provenance'; const summary = document.createElement('summary'); summary.textContent = 'Publication time and reporting window'; disclosure.append(summary); if (timestamp) { const exactTime = timestamp.cloneNode(true); exactTime.textContent = timestamp.getAttribute('datetime') || timestamp.textContent; const published = document.createElement('p'); published.append('Published ', exactTime); disclosure.append(published); timestamp.textContent = ageLabel(timestamp.getAttribute('datetime')); timestamp.title = exactTime.textContent; } if (window) { const limitation = 'Recorded evidence, not independent live verification.'; if (window.textContent.includes(limitation)) { const visibleLimitation = window.cloneNode(false); visibleLimitation.textContent = limitation; window.textContent = window.textContent.replace(limitation, '').trim(); window.after(visibleLimitation); } disclosure.append(window); } publication.append(disclosure); } for (const code of publication.querySelectorAll('code')) { const commit = code.textContent.trim(); if (!/^[a-f0-9]{40}$/i.test(commit)) continue; const disclosure = document.createElement('details'); disclosure.className = 'briefing-provenance'; const summary = document.createElement('summary'); summary.textContent = `Commit ${shortCommit(commit)}`; const exact = document.createElement('code'); exact.textContent = commit; disclosure.append(summary, exact); code.replaceWith(disclosure); } } function shortCommit(value) { return value ? String(value).slice(0, 9) : '—'; } function ageLabel(value) { if (!value) return 'time not recorded'; const time = Date.parse(value); if (!Number.isFinite(time)) return 'time unavailable'; const minutes = Math.max(0, Math.floor((Date.now() - time) / 60_000)); if (minutes < 1) return 'just now'; if (minutes < 60) return `${minutes}m ago`; const hours = Math.floor(minutes / 60); if (hours < 24) return `${hours}h ago`; return `${Math.floor(hours / 24)}d ago`; } function taskCard(task, healthFindings = []) { const affected = (task.affectedDomains ?? []).join(', '); const dependencies = (task.dependencies ?? []).join(', '); const acceptance = (task.acceptanceCriteria ?? []).map((criterion) => `${escapeHtml(detail || 'No task description recorded.')}
${escapeHtml(task.id)}${escapeHtml(staleEvidence.recommendation)}
${escapeHtml(report.summary)}
${escapeHtml(report.reviewedAt)} · ${report.window?.complete ? 'Full review window' : 'Interim review'} · Evidence is reviewer-reported, not independently verified.
| Metric | Baseline | Observed | Evidence quality |
|---|---|---|---|
| ${escapeHtml(metric.name)}${escapeHtml(metric.unit)} | ${escapeHtml(metric.baseline)} | ${escapeHtml(metric.observed)} | ${escapeHtml(metric.classification)} |
No organization change is made by this recommendation. Adoption or reversal requires a separate owner-confirmed conclusion plan.
${escapeHtml(id)}${escapeHtml(type === 'fleet' ? (proposal.expectedBenefit ?? proposal.rationale ?? 'No summary provided.') : (proposal.proposal?.rationale ?? 'No rationale provided.'))}
${escapeHtml(JSON.stringify(details, null, 2))}${group.tasks.length} linked ${group.tasks.length === 1 ? 'task' : 'tasks'} · canceled tasks are excluded from the completion denominator.
${escapeHtml(task.id)} ${escapeHtml(task.title)}${escapeHtml(task.state)}${escapeHtml(task.owner ?? 'Unassigned')}No hierarchy blockers. These are planned orders only; no sessions were started or stopped.
'; setHtml('#organization-lifecycle', `Derived from approved reporting lines. Independent sessions keep their configured roster order.
Reporting, coordination, and implementation are separate relationships. A role does not create an identity or grant owner-only approval.
${escapeHtml(role.kind)} · ${escapeHtml(role.identity_id)}
Inspect the runtime before owner-approved CLI recovery. No automatic retry or budget refund.
' : ''}${escapeHtml(cadenceCopy(manager.cadence))} · timer installation not verified
${reports.length ? reports.map((report) => { const approval = reportsWithApprovals.get(report.areaId); const label = approval ? `waiting on ${approval.approver === 'owner' ? 'owner' : (agents.get(approval.approver)?.title ?? approval.approver)}` : report.state === 'waiting' ? 'wait reason not recorded' : report.state === 'offline' ? 'offline' : report.state === 'stale' ? 'stale' : report.state === 'missing' ? 'identity missing' : report.state; const task = report.task ? ` · ${report.task}` : ''; const cls = approval || report.state === 'waiting' ? 'is-waiting' : stateClass(report.state); return `${findings.filter((finding) => finding.type === 'unacknowledged-message').reduce((sum, finding) => sum + finding.count, 0)} direct-report message(s) still need acknowledgement.
` : ''}${escapeHtml(requester?.title ?? approval.requester)} is waiting on ${escapeHtml(approver)}${refs ? ` · ${refs}` : ''}
${escapeHtml(approval.summary)}
Decision belongs to ${escapeHtml(approver)}. The owner Console will not transfer that authority.
`}${escapeHtml(item.detail)}
Severity: ${escapeHtml(severity)} · Owner: ${escapeHtml(item.owner)}${item.waitSince ? ` · Waiting ${escapeHtml(ageLabel(item.waitSince))}` : ''} ${item.evidence.length > 120 ? `${escapeHtml(item.evidence)}
${escapeHtml(observation.taskId ?? 'Task reference not recorded')} · ${escapeHtml(observation.code)}
· Owner: ${escapeHtml(observation.owner ?? 'Owner not recorded')}
· Observed source/revision: ${escapeHtml(observation.observedAt ?? 'Not recorded')}
· Current observed commit: ${escapeHtml(observation.currentObservedCommit ?? 'Not recorded')}
· Reproduction: ${escapeHtml(observation.reproductionStatus ?? 'UNKNOWN')}
· Sources: ${escapeHtml(observation.sources.join(', ') || 'Not recorded')}
${escapeHtml(description)}
`}${escapeHtml(message.body)}
${escapeHtml(ack)}${refs.length ? ` · ${escapeHtml(refs.join(' · '))}` : ''}${escapeHtml(shortCommit(artifact.commit))}`).join('') : '${escapeHtml(comment.body)}
No owner feedback on this image.
'}${escapeHtml(decisions)}
` : empty('No tracked decisions.')); const locality = snapshot.contextLocality; setHtml('#context-detail', locality?.measured ? (locality.samples ?? []).map((sample) => `${escapeHtml(locality?.reason ?? 'Runtime usage reporting is not available.')}
TORCH compares cache activity with verified outcomes, not token count alone.`); } let liveUpdatesPaused = false; let appliedRefreshes = 0; const refreshScheduler = globalThis.TorchLiveRefresh.createScheduler({ load: async () => { if (demoWorkspace) return demoWorkspace.snapshot(); const response = await fetch('/api/snapshot', { cache: 'no-store', signal: AbortSignal.timeout(10_000) }); const snapshot = await response.json(); if (!response.ok) throw new Error(snapshot.message ?? snapshot.error); if (snapshot.schema !== 'torch.dev/observation/v1alpha1') throw new Error('Snapshot schema is unavailable or unsupported'); return snapshot; }, apply: (snapshot) => { const viewportBeforeRender = appliedRefreshes > 0 ? { left: globalThis.scrollX, top: globalThis.scrollY } : null; const userIntentAtRender = consoleViewRouter.userIntentVersion(); const editedBeforeRender = refreshProtection.dirty(); heldPanels = 0; renderingSnapshot = true; try { render(snapshot); } finally { renderingSnapshot = false; } invalidateStalePriorityPreviews(snapshot.backlog ?? []); refreshProtection.remember({ preserve: editedBeforeRender }); $('#console-error').hidden = true; const status = $('#live-refresh-status'); const renderGeneration = ++appliedRefreshes; status.textContent = `${liveUpdatesPaused ? 'Automatic updates paused.' : 'Updates every 15 seconds while visible.'}${heldPanels ? ' Edited forms and active previews retained; their panels may show older state.' : ''}`; globalThis.requestAnimationFrame(() => globalThis.requestAnimationFrame(() => { if (renderGeneration !== appliedRefreshes) return; if (viewportBeforeRender && consoleViewRouter.userIntentVersion() === userIntentAtRender) { globalThis.scrollTo?.(viewportBeforeRender.left, viewportBeforeRender.top); } if (renderGeneration === 1) consoleViewRouter.afterInitialLayout(); status.dataset.generation = String(renderGeneration); })); }, onError: (caught) => { const error = $('#console-error'); error.textContent = `Snapshot unavailable: ${caught.message}. Last displayed evidence retained.`; error.hidden = false; }, }); function refresh({ completed = null, background = false } = {}) { if (completed) refreshProtection.complete(completed); return refreshScheduler.request({ supersede: !background }); } async function feedbackRequest(path, payload) { if (demoWorkspace) return demoWorkspace.request(path, payload); const response = await fetch(path, { method: 'POST', cache: 'no-store', credentials: 'same-origin', headers: { 'content-type': 'application/json' }, body: JSON.stringify(payload), }); const result = await response.json(); if (!response.ok) throw new Error(result.message ?? result.error ?? `Request failed (${response.status})`); return result; } async function consoleActionRequest(path, payload) { if (demoWorkspace) return demoWorkspace.request(path, payload); const response = await fetch(path, { method: 'POST', cache: 'no-store', credentials: 'same-origin', headers: { 'content-type': 'application/json' }, body: JSON.stringify(payload), }); const result = await response.json(); if (!response.ok) throw new Error(result.message ?? result.error ?? `Request failed (${response.status})`); return result; } function approvalDecisionStatus(form, message, error = false) { const status = form.querySelector('.approval-decision-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function clearApprovalDecision(form, message = 'Preview cleared. Review the current request before deciding.') { delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[name="decision"]').disabled = false; form.querySelector('[name="note"]').disabled = false; form.querySelector('[data-approval-preview]').disabled = false; form.querySelector('[data-approval-preview-panel]').hidden = true; form.querySelector('[data-approval-confirm]').hidden = true; form.querySelector('[data-approval-edit]').hidden = true; approvalDecisionStatus(form, message); } $('#approval-request-list')?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-approval-edit]'); if (edit) { const form = edit.closest('.approval-decision-form'); if (form) clearApprovalDecision(form); return; } const previewButton = event.target.closest('[data-approval-preview]'); const confirmButton = event.target.closest('[data-approval-confirm]'); const form = event.target.closest('.approval-decision-form'); if (!form) return; if (previewButton) { const decision = form.querySelector('[name="decision"]').value; const note = form.querySelector('[name="note"]').value.trim(); if (!decision) { approvalDecisionStatus(form, 'Choose approve or reject first.', true); form.querySelector('[name="decision"]').focus(); return; } previewButton.disabled = true; approvalDecisionStatus(form, 'Rechecking the named approver and current request revision…'); try { const id = form.dataset.approvalId; const result = await consoleActionRequest(`/api/approvals/${encodeURIComponent(id)}/decision/preview`, { decision, note }); const { plan } = result; form.dataset.previewToken = result.token ?? ''; form.dataset.planHash = result.planHash; form.querySelector('[name="decision"]').disabled = true; form.querySelector('[name="note"]').disabled = true; form.querySelector('[data-approval-preview-panel]').hidden = false; form.querySelector('[data-approval-preview-title]').textContent = `Confirm ${plan.decision} · ${plan.title}`; form.querySelector('[data-approval-preview-effect]').textContent = plan.effect; form.querySelector('[data-approval-preview-scope]').textContent = JSON.stringify({ approvalId: plan.approvalId, requester: plan.requester, approver: plan.approver, revision: plan.revision, task: plan.task, evidence: plan.evidence, note: plan.note, }, null, 2); form.querySelector('[data-approval-confirm]').textContent = `Confirm ${plan.decision}`; form.querySelector('[data-approval-confirm]').hidden = false; form.querySelector('[data-approval-edit]').hidden = false; approvalDecisionStatus(form, 'Preview is bound to this request revision for five minutes.'); } catch (error) { approvalDecisionStatus(form, error.message, true); } finally { previewButton.disabled = false; } return; } if (!confirmButton) return; confirmButton.disabled = true; approvalDecisionStatus(form, 'Recording the owner decision and notifying the requester…'); try { const id = form.dataset.approvalId; const result = await consoleActionRequest(`/api/approvals/${encodeURIComponent(id)}/decision`, { decision: form.querySelector('[name="decision"]').value, note: form.querySelector('[name="note"]').value.trim(), token: form.dataset.previewToken, planHash: form.dataset.planHash, }); approvalDecisionStatus(form, `${result.approval.status} and requester notified.`); await refresh({ completed: form }); } catch (error) { approvalDecisionStatus(form, error.message, true); confirmButton.disabled = false; } }); function priorityStatus(form, message, error = false) { const status = form.querySelector('.priority-change-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function taskCreateStatus(form, message, error = false) { const status = form?.querySelector('.task-create-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function taskCreatePayload(form) { const data = new FormData(form); return { title: String(data.get('title') ?? '').trim(), description: String(data.get('description') ?? '').trim(), priority: String(data.get('priority') ?? 'normal'), affectedDomains: [...form.querySelector('[name="affectedDomains"]').selectedOptions].map((option) => option.value), dependencies: [...form.querySelector('[name="dependencies"]').selectedOptions].map((option) => option.value), acceptanceCriteria: String(data.get('acceptanceCriteria') ?? '').split('\n').map((item) => item.trim()).filter(Boolean), feature: String(data.get('feature') ?? '').trim(), milestone: String(data.get('milestone') ?? '').trim(), }; } function taskCreatePreviewMarkup(plan) { const task = plan.task; const criteria = task.acceptanceCriteria.map((item) => `This is the exact task TORCH will add.
${escapeHtml(task.description)}
${escapeHtml(shortCommit(task.observedAt))}${escapeHtml(plan.authority)} ${escapeHtml(plan.effect)}
`; } $('#task-create-form')?.addEventListener('submit', async (event) => { const form = event.target.closest('#task-create-form'); if (!form) return; event.preventDefault(); const button = form.querySelector('button[type="submit"]'); if (!button) return; button.disabled = true; taskCreateStatus(form, 'Preparing the exact task proposal…'); try { const payload = taskCreatePayload(form); const result = await consoleActionRequest('/api/backlog/tasks/preview', payload); form.dataset.createPayload = JSON.stringify(payload); form.dataset.previewToken = result.token; form.dataset.planHash = result.planHash; form.querySelector('[data-task-create-fields]').disabled = true; const preview = form.querySelector('[data-task-create-preview]'); preview.innerHTML = taskCreatePreviewMarkup(result.plan); preview.hidden = false; taskCreateStatus(form, 'Review routing hints and the proposed, unassigned effect before confirming.'); } catch (error) { taskCreateStatus(form, error.message, true); } finally { button.disabled = false; } }); $('#task-create-form')?.addEventListener('click', async (event) => { const form = event.currentTarget; const edit = event.target.closest('[data-task-create-edit]'); if (edit) { delete form.dataset.createPayload; delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[data-task-create-fields]').disabled = false; form.querySelector('[data-task-create-preview]').hidden = true; taskCreateStatus(form, 'Preview cleared. Review the edited proposal before creating it.'); return; } const confirm = event.target.closest('[data-task-create-confirm]'); if (!confirm) return; const token = form.dataset.previewToken; const planHash = form.dataset.planHash; if (!token || !planHash || !form.dataset.createPayload) return; confirm.disabled = true; taskCreateStatus(form, 'Creating the reviewed task proposal…'); try { const payload = JSON.parse(form.dataset.createPayload); const result = await consoleActionRequest('/api/backlog/tasks', { ...payload, token, planHash }); setText('#task-create-action-status', `${result.task.id} added as proposed and unassigned. The Session Manager retains triage; no agent was started.`); $('#task-create-action-status').hidden = false; form.reset(); form.querySelector('[data-task-create-fields]').disabled = false; form.querySelector('[data-task-create-preview]').hidden = true; delete form.dataset.createPayload; delete form.dataset.previewToken; delete form.dataset.planHash; form.closest('details').open = false; taskCreateStatus(form, 'Task proposal created.'); await refresh({ completed: form }); } catch (error) { delete form.dataset.createPayload; delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[data-task-create-fields]').disabled = false; form.querySelector('[data-task-create-preview]').hidden = true; taskCreateStatus(form, `${error.message} Review the task list before trying again.`, true); } finally { confirm.disabled = false; } }); $('#backlog-board')?.addEventListener('submit', async (event) => { const form = event.target.closest('.priority-change-form'); if (!form) return; event.preventDefault(); const priority = form.querySelector('[name="priority"]')?.value; const reason = form.querySelector('[name="reason"]')?.value.trim(); const expectedRevision = Number(form.dataset.revision); const button = form.querySelector('button[type="submit"]'); if (!priority || !reason || !button) return; button.disabled = true; priorityStatus(form, 'Preparing the exact priority-change preview…'); try { const result = await consoleActionRequest(`/api/backlog/tasks/${encodeURIComponent(form.dataset.taskId)}/priority/preview`, { priority, reason, expectedRevision, }); const plan = result.plan; form.dataset.previewToken = result.token; form.dataset.planHash = result.planHash; form.querySelector('[name="priority"]').disabled = true; form.querySelector('[name="reason"]').disabled = true; const preview = form.querySelector('[data-priority-preview]'); preview.innerHTML = `${escapeHtml(plan.taskId)} · ${escapeHtml(plan.title)}${escapeHtml(plan.reason)}
${escapeHtml(plan.effect)}
`; preview.hidden = false; priorityStatus(form, 'Review the task, revision, priority, reason, and effect before applying.'); } catch (error) { priorityStatus(form, error.message, true); } finally { button.disabled = false; } }); $('#backlog-board')?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-priority-edit]'); if (edit) { const form = edit.closest('.priority-change-form'); if (!form) return; delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[name="priority"]').disabled = false; form.querySelector('[name="reason"]').disabled = false; form.querySelector('[data-priority-preview]').hidden = true; priorityStatus(form, 'Preview cleared. Review the edited priority again before applying.'); return; } const confirm = event.target.closest('[data-priority-confirm]'); if (!confirm) return; const form = confirm.closest('.priority-change-form'); const token = form?.dataset.previewToken; const planHash = form?.dataset.planHash; if (!form || !token || !planHash) return; confirm.disabled = true; priorityStatus(form, 'Applying the reviewed priority change…'); try { const result = await consoleActionRequest(`/api/backlog/tasks/${encodeURIComponent(form.dataset.taskId)}/priority`, { priority: form.querySelector('[name="priority"]').value, reason: form.querySelector('[name="reason"]').value.trim(), expectedRevision: Number(form.dataset.revision), token, planHash, }); const actionStatus = $('#priority-action-status'); if (actionStatus) { actionStatus.textContent = `${result.task.id} priority is now ${result.task.priority}; task state and owner were unchanged.`; actionStatus.hidden = false; } await refresh({ completed: form }); } catch (error) { priorityStatus(form, error.message, true); confirm.disabled = false; } }); function workViewStatus(message) { setText('#work-view-status', message); } function applyWorkViewFilters(filters) { const normalized = workViews.normalizeFilters(filters); const active = currentBacklog.filter((task) => !['completed', 'cancelled'].includes(task.state)); renderWorkViewFilters(active, normalized); const values = { '#work-view-search': normalized.query, '#work-view-owner': normalized.owner, '#work-view-state': normalized.state, '#work-view-priority': normalized.priority, '#work-view-domain': normalized.domain, '#work-view-feature': normalized.feature, '#work-view-milestone': normalized.milestone, }; for (const [selector, value] of Object.entries(values)) { const control = $(selector); if (control) control.value = value; } renderBacklog(currentBacklog, currentBacklogHealth); } function persistCurrentView({ id = null } = {}) { if (!workViewState.storage || !workViewState.key || !workViews) { workViewStatus('This browser cannot save views. The project backlog was not changed.'); return; } const name = $('#work-view-name')?.value ?? ''; const result = workViews.saveView({ storage: workViewState.storage, key: workViewState.key, views: workViewState.views, id, name, filters: viewFiltersFromControls(), }); if (!result.ok) { workViewStatus(result.message); return; } workViewState.views = result.views; workViewState.selectedId = result.view.id; workViewState.warning = null; const nameInput = $('#work-view-name'); if (nameInput) { nameInput.value = result.view.name; delete nameInput.dataset.edited; } renderSavedViewPicker(); workViewStatus(`Saved “${result.view.name}” in this browser for this project.`); renderBacklog(currentBacklog, currentBacklogHealth); } function removeSelectedView() { if (!workViewState.storage || !workViewState.key || !workViewState.selectedId || !workViews) { workViewStatus('Choose a saved view before deleting it.'); return; } const selected = selectedSavedView(); const result = workViews.deleteView({ storage: workViewState.storage, key: workViewState.key, views: workViewState.views, id: workViewState.selectedId, }); if (!result.ok) { workViewStatus(result.message); return; } workViewState.views = result.views; workViewState.selectedId = ''; const nameInput = $('#work-view-name'); if (nameInput) { nameInput.value = ''; delete nameInput.dataset.edited; } renderSavedViewPicker(); applyWorkViewFilters(emptyWorkFilters); workViewStatus(`Deleted “${selected?.name ?? 'saved view'}”. Project tasks were not changed.`); } const workViewTools = $('.work-view-tools'); workViewTools?.addEventListener('input', (event) => { if (event.target.matches('#work-view-name')) { event.target.dataset.edited = 'true'; return; } if (!event.target.matches('#work-view-search')) return; renderBacklog(currentBacklog, currentBacklogHealth); workViewStatus('Filter edits are temporary until you save or update a view.'); }); workViewTools?.addEventListener('change', (event) => { if (event.target.matches('#work-view-select')) { const selected = workViewState.views.find((view) => view.id === event.target.value) ?? null; workViewState.selectedId = selected?.id ?? ''; const nameInput = $('#work-view-name'); if (nameInput) { nameInput.value = selected?.name ?? ''; delete nameInput.dataset.edited; } renderSavedViewPicker(); applyWorkViewFilters(selected?.filters ?? emptyWorkFilters); workViewStatus(selected ? `Loaded “${selected.name}”. Edit its filters, then update it or save a copy.` : 'Showing all active work.'); return; } if (!event.target.matches('#work-view-owner, #work-view-state, #work-view-priority, #work-view-domain, #work-view-feature, #work-view-milestone')) return; renderBacklog(currentBacklog, currentBacklogHealth); workViewStatus('Filter edits are temporary until you save or update a view.'); }); $('#work-view-save')?.addEventListener('click', () => persistCurrentView()); $('#work-view-update')?.addEventListener('click', () => persistCurrentView({ id: workViewState.selectedId })); $('#work-view-delete')?.addEventListener('click', removeSelectedView); $('#work-view-clear')?.addEventListener('click', () => { workViewState.selectedId = ''; const nameInput = $('#work-view-name'); if (nameInput) { nameInput.value = ''; delete nameInput.dataset.edited; } renderSavedViewPicker(); applyWorkViewFilters(emptyWorkFilters); workViewStatus('Filters cleared. All active work is shown.'); }); function ownerRequestStatus(form, message, error = false) { const status = form.querySelector('.owner-request-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function clearOwnerRequestPreview(form, message = 'Preview cleared. Review the exact request before sending.') { delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[name="recipient"]').disabled = false; form.querySelector('[name="taskId"]').disabled = false; form.querySelector('[name="body"]').disabled = false; form.querySelector('[data-owner-request-preview]').disabled = false; form.querySelector('[data-owner-request-preview]').hidden = false; form.querySelector('[data-owner-request-review]').hidden = true; form.querySelector('[data-owner-request-confirm]').disabled = false; form.querySelector('[data-owner-request-confirm]').hidden = true; form.querySelector('[data-owner-request-edit]').hidden = true; ownerRequestStatus(form, message); } $('#owner-request-form')?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-owner-request-edit]'); if (edit) { clearOwnerRequestPreview(edit.closest('[data-owner-request]')); return; } const previewButton = event.target.closest('[data-owner-request-preview]'); if (previewButton) { const form = previewButton.closest('[data-owner-request]'); if (!form) return; const recipient = form.querySelector('[name="recipient"]').value; const body = form.querySelector('[name="body"]').value.trim(); if (!recipient || !body) { ownerRequestStatus(form, 'Choose an identity and write the request before previewing.', true); return; } previewButton.disabled = true; ownerRequestStatus(form, 'Checking the selected identity, task, and repository…'); try { const taskId = form.querySelector('[name="taskId"]').value; const result = await consoleActionRequest('/api/owner-requests/preview', { recipient, body, taskId }); const plan = result.plan; form.dataset.previewToken = result.token; form.dataset.planHash = result.planHash; form.querySelector('[name="recipient"]').disabled = true; form.querySelector('[name="taskId"]').disabled = true; form.querySelector('[name="body"]').disabled = true; previewButton.hidden = true; const panel = form.querySelector('[data-owner-request-review]'); panel.querySelector('[data-owner-request-title]').textContent = `Request to ${plan.recipientTitle} · ${plan.recipient}`; panel.querySelector('[data-owner-request-effect]').textContent = `${plan.effect} Repository: ${shortCommit(plan.currentHead)}${plan.task ? ` · Linked task: ${plan.task.id} (${plan.task.state}, owner ${plan.task.owner ?? 'unassigned'})` : ''}.`; panel.querySelector('[data-owner-request-exact]').textContent = plan.body; panel.querySelector('[data-owner-request-confirm]').hidden = false; panel.querySelector('[data-owner-request-edit]').hidden = false; panel.hidden = false; ownerRequestStatus(form, 'Preview ready. Check the recipient, task link, and exact request.'); } catch (error) { ownerRequestStatus(form, error.message, true); } finally { previewButton.disabled = false; } return; } const confirm = event.target.closest('[data-owner-request-confirm]'); if (!confirm) return; const form = confirm.closest('[data-owner-request]'); const token = form?.dataset.previewToken; const planHash = form?.dataset.planHash; if (!form || !token || !planHash) return; confirm.disabled = true; ownerRequestStatus(form, 'Sending the reviewed durable request…'); try { const result = await consoleActionRequest('/api/owner-requests', { recipient: form.querySelector('[name="recipient"]').value, taskId: form.querySelector('[name="taskId"]').value, body: form.querySelector('[name="body"]').value.trim(), token, planHash, }); const status = $('#owner-request-action-status'); if (status) { status.textContent = `Sent durable request ${result.message.id} to ${result.message.recipient}. It does not start or wake the agent.`; status.hidden = false; } form.querySelector('[name="body"]').value = ''; clearOwnerRequestPreview(form, 'Request sent. You can send another request when ready.'); await refresh({ completed: form }); } catch (error) { ownerRequestStatus(form, error.message, true); confirm.disabled = false; } }); const runtimeProfileForm = $('#runtime-profile-form'); runtimeProfileForm?.querySelector('[name="areaId"]')?.addEventListener('change', () => { const agent = runtimeProfileAgents.find((entry) => entry.areaId === runtimeProfileForm.querySelector('[name="areaId"]').value); runtimeProfileInputs(runtimeProfileForm, agent, agent?.runtime); }); runtimeProfileForm?.querySelector('[name="runtime"]')?.addEventListener('change', () => { const agent = runtimeProfileAgents.find((entry) => entry.areaId === runtimeProfileForm.querySelector('[name="areaId"]').value); runtimeProfileInputs(runtimeProfileForm, agent, runtimeProfileForm.querySelector('[name="runtime"]').value); }); runtimeProfileForm?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-runtime-profile-edit]'); if (edit) { clearRuntimeProfilePreview(runtimeProfileForm); runtimeProfileStatus(runtimeProfileForm, 'Preview cleared. Review the exact profile before saving.'); return; } const previewButton = event.target.closest('[data-runtime-profile-preview]'); if (previewButton) { const payload = { areaId: runtimeProfileForm.querySelector('[name="areaId"]').value, runtime: runtimeProfileForm.querySelector('[name="runtime"]').value, model: runtimeProfileForm.querySelector('[name="model"]').value.trim(), reasoning: runtimeProfileForm.querySelector('[name="reasoning"]').value.trim(), }; if (!payload.areaId || !payload.runtime) { runtimeProfileStatus(runtimeProfileForm, 'Choose an identity and an available agent.', true); return; } previewButton.disabled = true; runtimeProfileStatus(runtimeProfileForm, 'Validating this profile with its selected local adapter…'); try { const result = await consoleActionRequest('/api/runtime-profiles/preview', payload); const plan = result.plan; runtimeProfileForm.dataset.profilePayload = JSON.stringify(payload); runtimeProfileForm.dataset.previewToken = result.token; runtimeProfileForm.dataset.planHash = result.planHash; for (const field of runtimeProfileForm.querySelectorAll('select, input')) field.disabled = true; previewButton.hidden = true; const panel = runtimeProfileForm.querySelector('[data-runtime-profile-review]'); panel.querySelector('[data-profile-before]').textContent = profileDescription(plan.beforeProfile); panel.querySelector('[data-profile-after]').textContent = profileDescription(plan.profile); panel.querySelector('[data-profile-effect]').textContent = `${plan.effect} Reviewed at ${shortCommit(plan.currentHead)}.${plan.resetLaunchPolicy ? ' Switching adapters also clears the prior adapter-specific launch-policy override; the new adapter default applies.' : ''}`; panel.querySelector('[data-runtime-profile-confirm]').hidden = false; panel.querySelector('[data-runtime-profile-edit]').hidden = false; panel.hidden = false; runtimeProfileStatus(runtimeProfileForm, 'Review the current and next-launch profiles. Nothing has changed yet.'); } catch (error) { runtimeProfileStatus(runtimeProfileForm, error.message, true); } finally { previewButton.disabled = false; } return; } const confirm = event.target.closest('[data-runtime-profile-confirm]'); if (!confirm) return; const token = runtimeProfileForm.dataset.previewToken; const planHash = runtimeProfileForm.dataset.planHash; let payload; try { payload = JSON.parse(runtimeProfileForm.dataset.profilePayload ?? ''); } catch { return; } if (!token || !planHash) return; confirm.disabled = true; runtimeProfileStatus(runtimeProfileForm, 'Saving the reviewed profile for future launches…'); try { const result = await consoleActionRequest('/api/runtime-profiles', { ...payload, token, planHash }); const status = $('#runtime-profile-action-status'); if (status) { status.textContent = `Updated ${result.profile.areaId} for future launches. Any running session remains unchanged.`; status.hidden = false; } clearRuntimeProfilePreview(runtimeProfileForm); await refresh({ completed: runtimeProfileForm }); } catch (error) { runtimeProfileStatus(runtimeProfileForm, error.message, true); confirm.disabled = false; } }); const scheduleLauncherDetails = $('[data-schedule-launcher]'); scheduleLauncherDetails?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-schedule-launcher-edit]'); if (edit) { clearScheduleLauncherPreview(); return; } const previewButton = event.target.closest('[data-schedule-launcher-preview]'); if (previewButton) { const action = scheduleLauncherDetails.dataset.action; if (!['install', 'reconcile'].includes(action) || previewButton.dataset.launcherReady !== 'true') return; previewButton.disabled = true; scheduleLauncherStatus('Checking current ownership, unit files, and schedule configuration…'); try { const result = await consoleActionRequest('/api/schedule-launcher/preview', { action }); showScheduleLauncherPlan(scheduleLauncherDetails, result); } catch (error) { scheduleLauncherStatus(error.message, true); } finally { previewButton.disabled = false; } return; } const confirm = event.target.closest('[data-schedule-launcher-confirm]'); if (!confirm) return; const token = scheduleLauncherDetails.dataset.previewToken; const planHash = scheduleLauncherDetails.dataset.planHash; const action = scheduleLauncherDetails.dataset.action; if (!token || !planHash || !['install', 'reconcile'].includes(action)) return; confirm.disabled = true; scheduleLauncherStatus('Applying the reviewed timer setup…'); try { const result = await consoleActionRequest('/api/schedule-launcher', { action, token, planHash }); const status = $('#schedule-launcher-action-status'); if (status) { const verb = result.action === 'install' ? 'Installed' : 'Refreshed'; status.textContent = `${verb} the TORCH schedule timer for ${result.systemSchedules.length} system schedule(s). User systemd accepted the enable/start request; active state is not re-queried here. Audit ${result.auditEventId}.`; status.hidden = false; } clearScheduleLauncherPreview('Timer action completed. The refreshed snapshot below reports owned files and configuration digest.'); await refresh({ completed: scheduleLauncherDetails }); } catch (error) { scheduleLauncherStatus(error.message, true); confirm.disabled = false; } }); function feedbackStatus(form, message, error = false) { const status = form.querySelector('.feedback-form-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function showFeedbackPreview(form, result) { const preview = form.querySelector('[data-feedback-preview]'); const textarea = form.querySelector('textarea[name="body"]'); if (!preview || !textarea) return; const plan = result.preview; form.dataset.previewToken = result.token; form.dataset.planHash = result.planHash; textarea.disabled = true; preview.innerHTML = `${escapeHtml(shortCommit(plan.commit))}${escapeHtml(plan.body)}
This creates one durable message linked to this artifact. It does not change task status, priority, or ownership.
`; preview.hidden = false; feedbackStatus(form, 'Preview ready. Check the recipient and references before sending.'); } $('#artifact-list')?.addEventListener('submit', async (event) => { const form = event.target.closest('.artifact-feedback-form'); if (!form) return; event.preventDefault(); const textarea = form.querySelector('textarea[name="body"]'); const button = form.querySelector('button[type="submit"]'); if (!textarea || !button || !textarea.value.trim()) return; button.disabled = true; feedbackStatus(form, 'Preparing a review preview…'); try { const artifactId = form.dataset.artifactId; const result = await feedbackRequest(`/api/artifacts/${encodeURIComponent(artifactId)}/feedback/preview`, { body: textarea.value, }); showFeedbackPreview(form, result); } catch (error) { feedbackStatus(form, error.message, true); } finally { button.disabled = false; } }); $('#artifact-list')?.addEventListener('click', async (event) => { const edit = event.target.closest('[data-feedback-edit]'); if (edit) { const form = edit.closest('.artifact-feedback-form'); const textarea = form?.querySelector('textarea[name="body"]'); const preview = form?.querySelector('[data-feedback-preview]'); if (form && textarea && preview) { delete form.dataset.previewToken; delete form.dataset.planHash; textarea.disabled = false; preview.hidden = true; feedbackStatus(form, 'Preview cleared. Review the edited message again before sending.'); textarea.focus(); } return; } const confirm = event.target.closest('[data-feedback-confirm]'); if (!confirm) return; const form = confirm.closest('.artifact-feedback-form'); const textarea = form?.querySelector('textarea[name="body"]'); const token = form?.dataset.previewToken; const planHash = form?.dataset.planHash; if (!form || !textarea || !token || !planHash) return; confirm.disabled = true; feedbackStatus(form, 'Sending the reviewed message…'); try { const artifactId = form.dataset.artifactId; const result = await feedbackRequest(`/api/artifacts/${encodeURIComponent(artifactId)}/feedback`, { body: textarea.value, token, planHash, }); const actionStatus = $('#feedback-action-status'); if (actionStatus) { actionStatus.textContent = `Feedback sent to ${result.feedback.recipient} for ${result.feedback.taskId} at ${shortCommit(result.feedback.commit)}.`; actionStatus.hidden = false; } await refresh({ completed: form }); } catch (error) { feedbackStatus(form, error.message, true); confirm.disabled = false; } }); function organizationReviewStatus(form, message, error = false) { const status = form.querySelector('.organization-review-status'); if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); } function clearOrganizationReview(form, message = 'Preview cleared. Review the current proposal before deciding.') { delete form.dataset.previewToken; delete form.dataset.planHash; form.querySelector('[name="action"]').disabled = false; form.querySelector('[name="reason"]').disabled = false; form.querySelector('[data-review-preview]').disabled = false; form.querySelector('[data-review-preview-panel]').hidden = true; form.querySelector('[data-review-confirm]').hidden = true; form.querySelector('[data-review-edit]').hidden = true; organizationReviewStatus(form, message); } $('#change-list')?.addEventListener('click', async (event) => { const activationPreviewButton = event.target.closest('[data-hierarchy-activation-preview]'); if (activationPreviewButton) { const card = activationPreviewButton.closest('.hierarchy-activation'); const id = activationPreviewButton.dataset.id; const status = card?.querySelector('[data-hierarchy-activation-status]'); const setStatus = (message, error = false) => { if (!status) return; status.textContent = message; status.classList.toggle('is-error', error); }; activationPreviewButton.disabled = true; setStatus('Rechecking owner approval, repository state, and pilot blockers…'); try { const result = await consoleActionRequest(`/api/organization-proposals/hierarchy/${encodeURIComponent(id)}/activate/preview`, {}); const { plan } = result; const panel = card.querySelector('[data-hierarchy-activation-panel]'); card.dataset.previewToken = result.token ?? ''; card.dataset.planHash = result.planHash; panel.querySelector('[data-hierarchy-activation-title]').textContent = `${plan.confirmationLabel} · ${plan.title}`; panel.querySelector('[data-hierarchy-activation-effect]').textContent = plan.effect; panel.querySelector('[data-hierarchy-activation-scope]').textContent = JSON.stringify({ ownerIdentity: plan.ownerIdentity, currentHead: plan.currentHead, pilotPlan: plan.pilotPlan, }, null, 2); const confirm = panel.querySelector('[data-hierarchy-activation-confirm]'); confirm.textContent = plan.confirmationLabel; confirm.hidden = !result.token || !plan.pilotPlan.canProceed; panel.hidden = false; setStatus(plan.pilotPlan.canProceed ? 'Ready. Review the exact files and commit effect, then explicitly confirm.' : `Blocked by ${plan.pilotPlan.blockers.length} current condition${plan.pilotPlan.blockers.length === 1 ? '' : 's'}. Resolve them, then preview again.`, !plan.pilotPlan.canProceed); } catch (error) { setStatus(error.message, true); } finally { activationPreviewButton.disabled = false; } return; } const activationConfirm = event.target.closest('[data-hierarchy-activation-confirm]'); if (activationConfirm) { const card = activationConfirm.closest('.hierarchy-activation'); const proposalCard = activationConfirm.closest('.organization-proposal'); const id = proposalCard?.querySelector('[data-hierarchy-activation-preview]')?.dataset.id; const token = card?.dataset.previewToken; const planHash = card?.dataset.planHash; const status = card?.querySelector('[data-hierarchy-activation-status]'); if (!id || !token || !planHash) return; activationConfirm.disabled = true; if (status) { status.textContent = 'Committing the reviewed hierarchy pilot…'; status.classList.remove('is-error'); } try { const result = await consoleActionRequest(`/api/organization-proposals/hierarchy/${encodeURIComponent(id)}/activate`, { token, planHash }); const state = $('#organization-action-status'); if (state) { const timerNote = result.proposal.timerReconciliationRequired ? ' Reconcile the installed timer separately before trusting the new cadence.' : ' No timer was installed or changed.'; state.textContent = `${id} is piloting at ${shortCommit(result.proposal.activationCommit)}. No agent or runtime was started.${timerNote}`; state.hidden = false; } await refresh({ completed: card }); } catch (error) { if (status) { status.textContent = error.message; status.classList.add('is-error'); } activationConfirm.disabled = false; } return; } const edit = event.target.closest('[data-review-edit]'); if (edit) { const form = edit.closest('[data-organization-review]'); if (form) clearOrganizationReview(form); return; } const previewButton = event.target.closest('[data-review-preview]'); if (previewButton) { const form = previewButton.closest('[data-organization-review]'); const action = form?.querySelector('[name="action"]')?.value; if (!form || !action) { if (form) organizationReviewStatus(form, 'Choose a decision first.', true); return; } previewButton.disabled = true; organizationReviewStatus(form, 'Checking current proposal and owner authority…'); try { const type = form.dataset.type; const id = form.dataset.id; const reason = form.querySelector('[name="reason"]').value.trim(); const result = await consoleActionRequest(`/api/organization-proposals/${encodeURIComponent(type)}/${encodeURIComponent(id)}/preview`, { action, reason, }); const plan = result.plan; form.dataset.previewToken = result.token; form.dataset.planHash = result.planHash; form.querySelector('[name="action"]').disabled = true; form.querySelector('[name="reason"]').disabled = true; const panel = form.querySelector('[data-review-preview-panel]'); panel.querySelector('[data-review-title]').textContent = `${plan.confirmationLabel} · ${plan.title}`; panel.querySelector('[data-review-effect]').textContent = `${plan.effect} Current state: ${plan.currentState}. Repository: ${shortCommit(plan.currentHead)}.`; panel.querySelector('[data-review-scope]').textContent = JSON.stringify({ type: plan.type, id: plan.id, action: plan.action, reason: plan.reason, proposalRevision: plan.proposalRevision, baseCommit: plan.baseCommit, currentHead: plan.currentHead, ownerIdentity: plan.ownerIdentity, activeGraphRevision: plan.activeGraphRevision, activeGraphDigest: plan.activeGraphDigest, scope: plan.scope ?? { impact: plan.impact, observationWindow: plan.observationWindow, signals: plan.signals, alternatives: plan.alternatives, pilot: plan.pilot, roleChanges: plan.roleChanges, managerCheckInSchedules: plan.managerCheckInSchedules, timerReconciliation: plan.timerReconciliation, }, expectedBenefit: plan.expectedBenefit, evidence: plan.evidence, effect: plan.effect, }, null, 2); panel.querySelector('[data-review-confirm]').textContent = plan.confirmationLabel; panel.querySelector('[data-review-confirm]').hidden = !result.token || plan.canProceed === false; panel.querySelector('[data-review-edit]').hidden = false; panel.hidden = false; organizationReviewStatus(form, plan.canProceed === false ? 'Blocked. Inspect the current conditions in the plan; no confirmation is available.' : 'Preview ready. Read the effect and exact proposal scope before confirming.', plan.canProceed === false); } catch (error) { organizationReviewStatus(form, error.message, true); } finally { previewButton.disabled = false; } return; } const confirm = event.target.closest('[data-review-confirm]'); if (!confirm) return; const form = confirm.closest('[data-organization-review]'); const token = form?.dataset.previewToken; const planHash = form?.dataset.planHash; if (!form || !token || !planHash) return; confirm.disabled = true; organizationReviewStatus(form, 'Recording the reviewed owner decision…'); try { const result = await consoleActionRequest(`/api/organization-proposals/${encodeURIComponent(form.dataset.type)}/${encodeURIComponent(form.dataset.id)}`, { action: form.querySelector('[name="action"]').value, reason: form.querySelector('[name="reason"]').value.trim(), token, planHash, }); const status = $('#organization-action-status'); if (status) { const note = result.type === 'hierarchy-conclusion' ? demoWorkspace ? ' Demo decision only. No Git commit, agent or timer was changed.' : ' One scoped local conclusion commit was recorded. No agent or timer was started or stopped; review obsolete schedules separately.' : result.type === 'fleet' ? ' This does not provision or start the proposed identity.' : result.decision === 'approve-pilot' ? ' This approves planning only; after reviewing a fresh hierarchy-plan, the owner separately runs hierarchy-activate --by owner --yes. Activation does not start identities or timers.' : ' The active organization remains unchanged.'; status.textContent = `${result.proposal.id} recorded as ${result.proposal.state}.${note}`; status.hidden = false; } await refresh({ completed: form }); } catch (error) { organizationReviewStatus(form, error.message, true); confirm.disabled = false; } }); $('#attention-list')?.addEventListener('click', (event) => { const decisionButton = event.target.closest('[data-attention-decision]'); if (decisionButton) { const card = decisionButton.closest('.attention-item'); const status = card?.querySelector('.attention-action-status'); const approvalId = decisionButton.dataset.attentionApproval; const decision = decisionButton.dataset.attentionDecision; const form = [...document.querySelectorAll('#approval-request-list .approval-decision-form')] .find((candidate) => candidate.dataset.approvalId === approvalId); const previewButton = form?.querySelector('[data-approval-preview]'); const shortcut = globalThis.TorchAttentionActions.prepareOwnerDecisionShortcut(form, decision, previewButton ? (approvalForm) => { approvalForm.scrollIntoView({ behavior: 'smooth', block: 'center' }); previewButton.click(); } : null); if (!shortcut.started) { if (status) { status.textContent = shortcut.reason; status.hidden = false; } return; } if (status) { status.textContent = `Opening the guarded ${decision} preview for this owner-addressed request. Confirm only after reviewing its current evidence.`; status.hidden = false; } return; } const link = event.target.closest('a[href^="#"]'); const target = link && document.getElementById(link.getAttribute('href').slice(1)); const recipient = link?.dataset.attentionRecipient; if (recipient) { const form = $('#owner-request-form'); const recipientSelect = form?.elements.namedItem('recipient'); const body = form?.elements.namedItem('body'); const status = form?.querySelector('.owner-request-status'); const hasRecipient = [...(recipientSelect?.options ?? [])].some((option) => option.value === recipient); if (form && recipientSelect && body && hasRecipient && !recipientSelect.value && !body.value.trim()) { recipientSelect.value = recipient; if (status) status.textContent = `Selected ${recipient}. Add context and review the preview before sending anything.`; } } for (let parent = target?.parentElement; parent; parent = parent.parentElement) { if (parent.tagName === 'DETAILS') parent.open = true; } }); $('#refresh-console')?.addEventListener('click', () => refresh()); $('#fleet-attention-filter')?.addEventListener('input', (event) => applyFleetAttentionFilter(event.currentTarget.value)); $('#toggle-live-refresh')?.addEventListener('click', () => { liveUpdatesPaused = !liveUpdatesPaused; $('#toggle-live-refresh').textContent = liveUpdatesPaused ? 'Resume updates' : 'Pause updates'; $('#toggle-live-refresh').setAttribute('aria-pressed', String(liveUpdatesPaused)); $('#live-refresh-status').textContent = liveUpdatesPaused ? 'Automatic updates paused. Manual refresh preserves edits.' : 'Updates every 15 seconds while visible.'; if (!liveUpdatesPaused && document.visibilityState === 'visible') refresh(); }); let liveRefreshTimer = null; function startLiveRefreshTimer() { if (liveRefreshTimer !== null) return; liveRefreshTimer = setInterval(() => { if (!liveUpdatesPaused && document.visibilityState === 'visible') refresh({ background: true }); }, 15_000); } startLiveRefreshTimer(); document.addEventListener('visibilitychange', () => { if (!liveUpdatesPaused && document.visibilityState === 'visible') refresh(); }); globalThis.addEventListener('pagehide', () => { clearInterval(liveRefreshTimer); liveRefreshTimer = null; }); globalThis.addEventListener('pageshow', (event) => { startLiveRefreshTimer(); if (event.persisted && !liveUpdatesPaused && document.visibilityState === 'visible') refresh(); }); if (demoWorkspace) { $('#demo-banner').hidden = false; $('#reset-demo')?.addEventListener('click', () => { demoWorkspace.reset(); globalThis.location.reload(); }); } consoleViewRouter.sync({ force: true }); refresh();