Files
AgentHub/server/openapi-extra.js
T
nntrivi2001 e94038481e feat: v2.7.7 — File Explorer on workspaces and the user's home, clone with per-user git identity
- File Explorer (Files in the sidebar, /files; also from a workspace's Files
  tab, portalled so no panel clips it), laid out like GNOME Files: places
  (Home, workspaces, Trash), Back/Forward/Up, path bar, search, icon grid with
  image thumbnails or list, labelled New/Upload, selection action bar, hidden
  files behind Ctrl+H, right-click menus and the usual keys.
  Make, rename, move, copy (within a workspace, between workspaces, home ↔
  workspace), delete into a per-account trash restorable for 7 days, streamed
  upload of files and whole folders (≤ 500 MB a batch, Replace / Keep both /
  Skip on a taken name), download a file or a zip of anything.
  server/lib/file-explorer.js, /api/lanes/:id/fs/*, /api/homes/:who/fs/*.
- The user's home: every dot entry at its top stays hidden and refused
  (also via a symlink, download, zip or as a copy source); an admin may view
  other users' homes read-only, audited.
- write-as learns move/copy (re-run `sudo agenthub server install-system`).
- Hardening: a write to a workspace re-checks its owner by the live role;
  S3 keeps its server.conf if the file stops reading and a tmux call never
  falls back to the host's server; the AI Proxy gateway marks what it relays
  and the dashboard refuses it; a NUL in a pane's argv/env is refused.
- OpenAPI for the new routes (server/openapi-extra/files.js); docs (API,
  SERVER-MODE, CLAUDE.md) updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:17:39 +07:00

64 lines
2.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");
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");
// 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,
push,
aiTools,
misc,
auth,
files,
overrideSessionsAgents,
overrideCore,
overridePricingAlerts,
overrideOps
);