Files
AgentHub/server/openapi-extra.js
T
nntrivi2001 2cc492bb88 feat(git): Branches & tags panel — rename, branch from any ref, upstream, tags
GET /git/refs lists local branches (upstream, ahead/behind, last commit,
merged, held by a worktree, protected), remote branches grouped by remote
and tags (target, annotated message/tagger/date). New writes in
server/lib/git-refs.js, dispatched from git-ops.js: branch-rename,
branch-upstream (set/unset), tag-create (light/annotated), tag-delete
(confirm), tag-push (one tag to origin, no --tags, no force), and
branch-create with a looked-up from + switch on a clean tree. Every ref is
looked up, never passed through; repo-wide writes are repo-root only
(ESUBDIR) and refused during any operation (EMERGING).

Client: git/BranchManager + TagManager dialog opened from the git bar's
tags icon, en+vi (gitRefs namespace), keyboard navigable.

# Conflicts:
#	CLAUDE.md
#	client/src/components/lanes/LaneGitBar.tsx
#	docs/API.md
#	server/__tests__/lanes-api.test.js
#	server/routes/lanes.js
2026-11-02 12:00:55 +07:00

79 lines
3.0 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");
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");
// 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,
artifacts,
lanesMore,
toolsMore,
opsMore,
overrideSessionsAgents,
overrideCore,
overridePricingAlerts,
overrideOps,
gitRefs
);
// The branch & tag writes join the git action entry in place.
gitRefs.extend(module.exports);