feat(ui): Sentinel view — Yerin global security chat
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ const VIEWS = {
|
|||||||
search: () => import('./views/search.js'),
|
search: () => import('./views/search.js'),
|
||||||
inbox: () => import('./views/inbox.js'),
|
inbox: () => import('./views/inbox.js'),
|
||||||
'sacred-valley': () => import('./views/sacred_valley.js'),
|
'sacred-valley': () => import('./views/sacred_valley.js'),
|
||||||
|
sentinel: () => import('./views/sentinel.js'),
|
||||||
jobs: () => import('./views/jobs.js')
|
jobs: () => import('./views/jobs.js')
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -91,10 +91,10 @@ export function renderSidebar(root) {
|
|||||||
el('div', { class: 'sb-section' },
|
el('div', { class: 'sb-section' },
|
||||||
el('div', { class: 'sb-title' }, 'Navigate'),
|
el('div', { class: 'sb-title' }, 'Navigate'),
|
||||||
navItem('Sacred Valley', '/sacred-valley'),
|
navItem('Sacred Valley', '/sacred-valley'),
|
||||||
|
navItem('Sentinel', '/sentinel'),
|
||||||
navItem('Search', '/search'),
|
navItem('Search', '/search'),
|
||||||
inboxItem,
|
inboxItem,
|
||||||
navItem('Jobs', '/jobs'),
|
navItem('Jobs', '/jobs'),
|
||||||
el('div', { class: 'sb-item muted', title: 'Ships post-Plan-2' }, 'Agents — later'),
|
|
||||||
el('div', { class: 'sb-item muted', title: 'Ships post-Plan-2' }, 'Resources — later')
|
el('div', { class: 'sb-item muted', title: 'Ships post-Plan-2' }, 'Resources — later')
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
// #/search?q= search results
|
// #/search?q= search results
|
||||||
// #/inbox pending changes
|
// #/inbox pending changes
|
||||||
// #/sacred-valley dashboard placeholder
|
// #/sacred-valley dashboard placeholder
|
||||||
|
// #/sentinel Yerin security view
|
||||||
// Anything unrecognized falls through to the home handler.
|
// Anything unrecognized falls through to the home handler.
|
||||||
|
|
||||||
const ROUTES = [
|
const ROUTES = [
|
||||||
@@ -19,6 +20,7 @@ const ROUTES = [
|
|||||||
{ name: 'search', re: /^\/search$/, keys: [] },
|
{ name: 'search', re: /^\/search$/, keys: [] },
|
||||||
{ name: 'inbox', re: /^\/inbox$/, keys: [] },
|
{ name: 'inbox', re: /^\/inbox$/, keys: [] },
|
||||||
{ name: 'sacred-valley', re: /^\/sacred-valley$/, keys: [] },
|
{ name: 'sacred-valley', re: /^\/sacred-valley$/, keys: [] },
|
||||||
|
{ name: 'sentinel', re: /^\/sentinel$/, keys: [] },
|
||||||
{ name: 'jobs', re: /^\/jobs$/, keys: [] },
|
{ name: 'jobs', re: /^\/jobs$/, keys: [] },
|
||||||
{ name: 'home', re: /^\/?$/, keys: [] }
|
{ name: 'home', re: /^\/?$/, keys: [] }
|
||||||
];
|
];
|
||||||
|
|||||||
25
public/views/sentinel.js
Normal file
25
public/views/sentinel.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// #/sentinel — Yerin's global, read-only security view. Uses the shared
|
||||||
|
// agent_chat panel pointed at /api/security/yerin (no draft cards).
|
||||||
|
import { el, mount } from '../dom.js';
|
||||||
|
import { wireAgentChat } from '../components/agent_chat.js';
|
||||||
|
|
||||||
|
const YERIN_LABELS = {
|
||||||
|
audit_log: '🗒️ reading the audit trail', agent_inventory: '👁️ reviewing agents',
|
||||||
|
pending_review: '⏳ checking the approval queue', resource_exposure: '🛡️ checking exposure',
|
||||||
|
token_audit: '🔑 auditing tokens'
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function render(main) {
|
||||||
|
const log = el('div', { class: 'rail-log sentinel-log' });
|
||||||
|
const input = el('textarea', { class: 'rail-input', rows: 1, placeholder: 'Ask Yerin about the Void’s security…' });
|
||||||
|
mount(main,
|
||||||
|
el('h1', { class: 'view-h1' }, '◆ Sentinel — Yerin'),
|
||||||
|
el('p', { class: 'view-sub' }, 'Read-only security & observability. She watches, reports, and warns — she never acts.'),
|
||||||
|
el('div', { class: 'sentinel-chat' }, log, el('div', { class: 'rail-inputwrap' }, input)));
|
||||||
|
const chat = wireAgentChat({
|
||||||
|
logEl: log, inputEl: input,
|
||||||
|
historyUrl: '/api/security/yerin', turnUrl: '/api/security/yerin/turn',
|
||||||
|
agentName: 'Yerin', showDrafts: false, toolLabels: YERIN_LABELS
|
||||||
|
});
|
||||||
|
await chat.load();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user