a chat under the lists, and the skill that makes it worth having

the layout gains a third node across the bottom, a third of the height. a
conversation reads badly in a narrow column and the two lists do not, so the
chat gets width rather than a column of its own.

it is officerdev/chat, the platform's own panel, not a simplified one of ours.
seedAppRegistry merges the platform's panels and every plugin's into one
registry, so naming it is all it takes — and a second chat maintained here
would be the one that falls behind.

the skill is deliberately NOT scoped to these routes. that was considered and
dropped once it was clear what a skill costs: compileSkills emits a name, a
description and a path, and the body is only read if the agent decides it is
relevant. two lines in every conversation. scoping would have meant a platform
change to buy back nothing.

(affordances are the opposite — loaded in full, every conversation — so this
plugin ships none. by docs/affordances.md's own test the 404 quirk does not
qualify: it CAN be fixed instead, and the platform route already fixes it.)

what the skill carries: the routes, that meta.nginx_online is the field for
"is it down", that renewal is at 30 days so under 14 is a real failure worth
raising unprompted and nothing else will raise it, that the 404 has already
been interpreted before it reaches you, and that disabling a host takes a
domain off the internet so it is confirmed and never inferred. plus what is
not built, so it does not get offered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
2026-08-25 17:17:32 +00:00
co-authored by Claude Opus 5
parent 3d02cb6229
commit b8fd43d7ab
2 changed files with 125 additions and 5 deletions
+31 -5
View File
@@ -1,13 +1,39 @@
import type { LayoutNode } from 'officerdev';
// Hosts wide, certificates beside it. Certificates is a glance rather than a workspace — you look at it
// when something is red — so it gets the narrower half.
// Hosts wide, certificates beside it, a chat across the bottom.
//
// ── Why the chat panel is the platform's and not one of ours ──
//
// `officerdev/chat` is a panel app in the shared registry — `seedAppRegistry` merges the platform's panels
// and every plugin's into ONE registry, so naming it here is all it takes. Shipping a second, simpler chat
// from this plugin would mean maintaining a second chat, and the first one to fall behind would be ours.
//
// It gets a third of the height rather than a column, because a conversation reads badly in a narrow
// column and the two lists do not: they are scannable at any width, and a chat is not.
//
// ── What makes the chat useful HERE ──
//
// Nothing in this layout. The agent gets the `Proxy Manager` skill the same way it gets every other one —
// from this plugin's `skills/` directory, offered in every conversation on the machine, costing two lines
// until something actually needs it. A chat in this panel is an ordinary chat that happens to be sitting
// underneath the thing it is being asked about.
export const defaultLayout: LayoutNode = {
type: 'group',
id: 'proxy-manager-root',
direction: 'horizontal',
direction: 'vertical',
children: [
{ node: { type: 'panel', id: 'proxy-manager-hosts', appType: 'proxy-manager-hosts' }, size: 62 },
{ node: { type: 'panel', id: 'proxy-manager-certificates', appType: 'proxy-manager-certificates' }, size: 38 },
{
node: {
type: 'group',
id: 'proxy-manager-lists',
direction: 'horizontal',
children: [
{ node: { type: 'panel', id: 'proxy-manager-hosts', appType: 'proxy-manager-hosts' }, size: 62 },
{ node: { type: 'panel', id: 'proxy-manager-certificates', appType: 'proxy-manager-certificates' }, size: 38 },
],
},
size: 66,
},
{ node: { type: 'panel', id: 'proxy-manager-chat', appType: 'officerdev/chat' }, size: 34 },
],
};