c946b73d11
Remote clients (docs/plans/remote-clients/README.md, B1–B3 for the Claude pool): - server/hub/ holds the hub-only code (devices, remote sessions, upload ingest, LAN gateway), required only in server mode; hub-boundary.test.js keeps local code from importing it. - A local install enrolls with `agenthub remote login` or Settings → AI tools → Company hub; the "Company account" AI Proxy (reserved name agenthub.company) sends a session through the hub's gateway, which adds a pool account's token — no credential reaches the machine. Only those sessions are uploaded, hourly and at their end; secret-shaped strings are redacted on the client. - Gateway refuses: unknown device (401), a message without a session id, an unregistered session under AGENTHUB_REMOTE_GATE=block, a user over quota (EQUOTA), a purged session (410). Device tokens 90 days, conversations 30. - New alert rule type remote_unmonitored: a company-account session its device never registered; a late registration clears the flag instead. - The hub imports a session once per upload round (chunks carry `more`), not once per chunk. Artifacts: - Share an artifact with chosen people (artifact_shares, PATCH sharedWith, GET /api/artifacts/people) besides everyone; a "Shared with you" tab. Only the owner or an admin sees or edits who it is shared with; audited. - Folders: each account's own arrangement (agenthub.artifacts.folders pref). - A claude.ai page keeps a copy viewable without the publishing account: its HTML file (and supporting files) snapshotted at publish, or the copy Claude saves for a Doc / Slides / Design in artifacts-export/ (a synchronous PostToolUse hint hook, scripts/artifact-export-hint.js, admin switch), attached to the page at Stop. Viewed in HtmlFrame's sandbox, Markdown, or pdf.js (pdfjs-dist 6.4.299, legacy build, loaded only for a PDF). Fixes: - tmux: a cached /proc/<pid>/exe of an exited server falls back to PATH's tmux (stop the last pane, start again within 10 s failed with ENOENT). - shelves: a shelf restores beside changes in other files. - chat: a finished reply ends the turn even with no hook at all. - Settings → AI tools: profile list display tweaks.
86 lines
3.3 KiB
JavaScript
86 lines
3.3 KiB
JavaScript
/**
|
|
* @file Supplementary OpenAPI fragments merged into the base spec by
|
|
* `createOpenApiSpec()` (server/openapi.js). Each domain fragment under
|
|
* `server/openapi-extra/` exports `{ tags, schemas, paths }`; this module
|
|
* deep-combines them into one `{ tags, schemas, paths }` object. Extra paths
|
|
* and schemas OVERRIDE base entries with the same key, so a comprehensive
|
|
* entry here can supersede a terser one in the base literal; tags are appended
|
|
* only when their `name` is not already present.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
// New endpoint groups (previously-undocumented gaps in the base spec).
|
|
const ccConfig = require("./openapi-extra/cc-config");
|
|
const codexConfig = require("./openapi-extra/codex-config");
|
|
const run = require("./openapi-extra/run");
|
|
const lanes = require("./openapi-extra/lanes");
|
|
// The history reads; its /git/log replaces the shorter entry in lanes.js.
|
|
const gitHistory = require("./openapi-extra/git-history");
|
|
const push = require("./openapi-extra/push");
|
|
const aiTools = require("./openapi-extra/ai-tools");
|
|
const misc = require("./openapi-extra/misc");
|
|
const auth = require("./openapi-extra/auth");
|
|
const files = require("./openapi-extra/files");
|
|
const artifacts = require("./openapi-extra/artifacts");
|
|
// Routes the spec had missed (audit 2026-10-22): new path keys only — a key
|
|
// that already existed got its missing method in place instead.
|
|
const lanesMore = require("./openapi-extra/lanes-more");
|
|
const toolsMore = require("./openapi-extra/tools-more");
|
|
const opsMore = require("./openapi-extra/ops-more");
|
|
// The git bar's Branches panel (GET /git/refs + the branch & tag writes).
|
|
const gitRefs = require("./openapi-extra/git-refs");
|
|
// The remote-clients architecture: the hub's /api/remote, the local /api/remote-client.
|
|
const remote = require("./openapi-extra/remote");
|
|
// Enriched overrides of already-documented endpoints — same operationId, tags,
|
|
// and request/response `$ref` schemas as the base, with added examples and
|
|
// richer descriptions. Listed last so they win the merge.
|
|
const overrideSessionsAgents = require("./openapi-extra/override-sessions-agents");
|
|
const overrideCore = require("./openapi-extra/override-core");
|
|
const overridePricingAlerts = require("./openapi-extra/override-pricing-alerts");
|
|
const overrideOps = require("./openapi-extra/override-ops");
|
|
|
|
/** Combine N fragments into a single { tags, schemas, paths }. Later fragments
|
|
* override earlier ones on path/schema key collisions; tags dedupe by name. */
|
|
function combine(...fragments) {
|
|
const out = { tags: [], schemas: {}, paths: {} };
|
|
const tagNames = new Set();
|
|
for (const frag of fragments) {
|
|
if (!frag) continue;
|
|
for (const tag of frag.tags || []) {
|
|
if (tag && !tagNames.has(tag.name)) {
|
|
tagNames.add(tag.name);
|
|
out.tags.push(tag);
|
|
}
|
|
}
|
|
Object.assign(out.schemas, frag.schemas || {});
|
|
Object.assign(out.paths, frag.paths || {});
|
|
}
|
|
return out;
|
|
}
|
|
|
|
module.exports = combine(
|
|
ccConfig,
|
|
codexConfig,
|
|
run,
|
|
lanes,
|
|
gitHistory,
|
|
push,
|
|
aiTools,
|
|
misc,
|
|
auth,
|
|
files,
|
|
artifacts,
|
|
lanesMore,
|
|
toolsMore,
|
|
opsMore,
|
|
require("./openapi-extra/git-rewrite"),
|
|
overrideSessionsAgents,
|
|
overrideCore,
|
|
overridePricingAlerts,
|
|
overrideOps,
|
|
gitRefs,
|
|
remote
|
|
);
|
|
// The branch & tag writes join the git action entry in place.
|
|
gitRefs.extend(module.exports);
|