An operator now links an agent's external forge account (label, base URL, token) in the swarm UI. swarm-controller stores it at swarm/agents/<agent>/forge/<label>. There is no index: the store's listing of the agent's forge/ directory is the set of accounts. In the agent, hive-agent-forge-accounts (oneshot + 2-minute timer, as the agent user, under its own store certificate) lists swarm/agents/<agent>/forge/ with the `list` #4866 grants an agent on its own metadata subtree, reads each account, and writes <state>/forge-<label>-token and forge-<label>.json in the names and shape hive-forge -f already reads. An empty listing (a 404, which `bao kv list -format=json` answers with `{}` and an empty stderr) is zero accounts; a denial or an unreachable store fails the unit. It never deletes: files for labels not listed, including ones the hive wrote, stay as they are. Removed: the dashboard FORGES tab (credentials.js/html section and its CSS), hive-c0re's extra_forges.rs and its routes, priv_client's extra-forge calls, and hive-priv's WriteAgentExtraForgeAccount / DeleteAgentExtraForgeAccount with their helpers. The GITHUB tab and WriteAgentGithubToken stay. Also: persistence.md's matrix avatar note names the exit-75 restart on a changed account listing, not the dashboard, as what brings a linked account up. Refs #4348
94 lines
1.8 KiB
CSS
94 lines
1.8 KiB
CSS
/* CR3D3NTIALS page (/credentials.html) only. Page chrome
|
|
(.page-header / .page-back / .page-title) comes from the shared
|
|
chrome.css imported by common.css; base tab styling lives in
|
|
@hive/shared/tabs.css (.hive-tab*) same as /logs.html. This file holds
|
|
the account-list + provision-form styling specific to this surface
|
|
(`.ma-*` classes) plus the tab-strip layout delta + github-tab
|
|
additions (`.cred-*`). */
|
|
|
|
body.cred-shell {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
/* Same layout delta as .logs-tabbar: fill the header row next to the
|
|
← home back-link, and let the flex:1 nav shrink below its intrinsic
|
|
width instead of wrapping onto its own row. */
|
|
.cred-tabbar {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
.cred-main {
|
|
max-width: 720px;
|
|
margin: 0 auto;
|
|
padding: 1.2em 1.25rem 3rem;
|
|
}
|
|
|
|
.cred-pane[hidden] {
|
|
display: none;
|
|
}
|
|
|
|
.gh-status {
|
|
margin: 0.5rem 0 1.2rem;
|
|
}
|
|
.gh-status-line {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.6rem;
|
|
}
|
|
.gh-dot {
|
|
width: 0.6rem;
|
|
height: 0.6rem;
|
|
border-radius: 50%;
|
|
flex: none;
|
|
}
|
|
.gh-dot.present {
|
|
background: var(--green);
|
|
}
|
|
.gh-dot.absent {
|
|
background: var(--muted);
|
|
}
|
|
.gh-status-text.present {
|
|
color: var(--green);
|
|
}
|
|
.gh-status-text.absent {
|
|
color: var(--muted);
|
|
}
|
|
|
|
.ma-field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.25rem;
|
|
margin: 0.55rem 0;
|
|
}
|
|
.ma-field > span {
|
|
font-size: 0.8rem;
|
|
color: var(--muted);
|
|
}
|
|
.ma-field input,
|
|
.ma-field select {
|
|
padding: 0.4rem 0.5rem;
|
|
background: var(--bg-elev);
|
|
color: var(--fg);
|
|
border: 1px solid var(--border);
|
|
border-radius: 4px;
|
|
font: inherit;
|
|
}
|
|
.ma-field input:focus,
|
|
.ma-field select:focus {
|
|
outline: none;
|
|
border-color: var(--purple);
|
|
}
|
|
|
|
.ma-result {
|
|
margin-top: 0.7rem;
|
|
font-size: 0.9rem;
|
|
min-height: 1.2em;
|
|
}
|
|
.ma-result.ok {
|
|
color: var(--green);
|
|
}
|
|
.ma-result.err {
|
|
color: var(--red);
|
|
}
|