brains-mcp 1.61.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -0
- package/dist/access/projectShares.d.ts +48 -0
- package/dist/access/projectShares.d.ts.map +1 -0
- package/dist/access/projectShares.js +203 -0
- package/dist/access/projectShares.js.map +1 -0
- package/dist/access/sharedInstructionsNote.d.ts +37 -0
- package/dist/access/sharedInstructionsNote.d.ts.map +1 -0
- package/dist/access/sharedInstructionsNote.js +76 -0
- package/dist/access/sharedInstructionsNote.js.map +1 -0
- package/dist/admin/seedUsers.d.ts +23 -0
- package/dist/admin/seedUsers.d.ts.map +1 -0
- package/dist/admin/seedUsers.js +168 -0
- package/dist/admin/seedUsers.js.map +1 -0
- package/dist/api/openapi.d.ts +2 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +942 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/auth/clientStore.d.ts +43 -0
- package/dist/auth/clientStore.d.ts.map +1 -0
- package/dist/auth/clientStore.js +168 -0
- package/dist/auth/clientStore.js.map +1 -0
- package/dist/auth/deleteAccount.d.ts +34 -0
- package/dist/auth/deleteAccount.d.ts.map +1 -0
- package/dist/auth/deleteAccount.js +203 -0
- package/dist/auth/deleteAccount.js.map +1 -0
- package/dist/auth/oauth.d.ts +118 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +491 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/patStore.d.ts +87 -0
- package/dist/auth/patStore.d.ts.map +1 -0
- package/dist/auth/patStore.js +308 -0
- package/dist/auth/patStore.js.map +1 -0
- package/dist/auth/supabase.d.ts +15 -0
- package/dist/auth/supabase.d.ts.map +1 -0
- package/dist/auth/supabase.js +66 -0
- package/dist/auth/supabase.js.map +1 -0
- package/dist/auth/tokenStore.d.ts +73 -0
- package/dist/auth/tokenStore.d.ts.map +1 -0
- package/dist/auth/tokenStore.js +261 -0
- package/dist/auth/tokenStore.js.map +1 -0
- package/dist/backup/drive.d.ts +24 -0
- package/dist/backup/drive.d.ts.map +1 -0
- package/dist/backup/drive.js +70 -0
- package/dist/backup/drive.js.map +1 -0
- package/dist/billing/tierStore.d.ts +59 -0
- package/dist/billing/tierStore.d.ts.map +1 -0
- package/dist/billing/tierStore.js +152 -0
- package/dist/billing/tierStore.js.map +1 -0
- package/dist/digest/activityDigest.d.ts +32 -0
- package/dist/digest/activityDigest.d.ts.map +1 -0
- package/dist/digest/activityDigest.js +299 -0
- package/dist/digest/activityDigest.js.map +1 -0
- package/dist/digest/digestCron.d.ts +40 -0
- package/dist/digest/digestCron.d.ts.map +1 -0
- package/dist/digest/digestCron.js +146 -0
- package/dist/digest/digestCron.js.map +1 -0
- package/dist/digest/digestPreferences.d.ts +25 -0
- package/dist/digest/digestPreferences.d.ts.map +1 -0
- package/dist/digest/digestPreferences.js +79 -0
- package/dist/digest/digestPreferences.js.map +1 -0
- package/dist/digest/emailSender.d.ts +20 -0
- package/dist/digest/emailSender.d.ts.map +1 -0
- package/dist/digest/emailSender.js +35 -0
- package/dist/digest/emailSender.js.map +1 -0
- package/dist/drive/client.d.ts +43 -0
- package/dist/drive/client.d.ts.map +1 -0
- package/dist/drive/client.js +282 -0
- package/dist/drive/client.js.map +1 -0
- package/dist/drive/errors.d.ts +27 -0
- package/dist/drive/errors.d.ts.map +1 -0
- package/dist/drive/errors.js +51 -0
- package/dist/drive/errors.js.map +1 -0
- package/dist/drive/fileCache.d.ts +22 -0
- package/dist/drive/fileCache.d.ts.map +1 -0
- package/dist/drive/fileCache.js +57 -0
- package/dist/drive/fileCache.js.map +1 -0
- package/dist/governance/accessControl.d.ts +87 -0
- package/dist/governance/accessControl.d.ts.map +1 -0
- package/dist/governance/accessControl.js +179 -0
- package/dist/governance/accessControl.js.map +1 -0
- package/dist/html/components.d.ts +8 -0
- package/dist/html/components.d.ts.map +1 -0
- package/dist/html/components.js +19 -0
- package/dist/html/components.js.map +1 -0
- package/dist/html/layout.d.ts +7 -0
- package/dist/html/layout.d.ts.map +1 -0
- package/dist/html/layout.js +24 -0
- package/dist/html/layout.js.map +1 -0
- package/dist/html/metricsUi.d.ts +8 -0
- package/dist/html/metricsUi.d.ts.map +1 -0
- package/dist/html/metricsUi.js +271 -0
- package/dist/html/metricsUi.js.map +1 -0
- package/dist/httpServer.d.ts +19 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +3913 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/asyncJobRegistry.d.ts +30 -0
- package/dist/jobs/asyncJobRegistry.d.ts.map +1 -0
- package/dist/jobs/asyncJobRegistry.js +70 -0
- package/dist/jobs/asyncJobRegistry.js.map +1 -0
- package/dist/observability/metricsQuery.d.ts +41 -0
- package/dist/observability/metricsQuery.d.ts.map +1 -0
- package/dist/observability/metricsQuery.js +106 -0
- package/dist/observability/metricsQuery.js.map +1 -0
- package/dist/observability/relevanceSignal.d.ts +26 -0
- package/dist/observability/relevanceSignal.d.ts.map +1 -0
- package/dist/observability/relevanceSignal.js +95 -0
- package/dist/observability/relevanceSignal.js.map +1 -0
- package/dist/observability/requestEvents.d.ts +31 -0
- package/dist/observability/requestEvents.d.ts.map +1 -0
- package/dist/observability/requestEvents.js +54 -0
- package/dist/observability/requestEvents.js.map +1 -0
- package/dist/observability/slowQueryAlert.d.ts +25 -0
- package/dist/observability/slowQueryAlert.d.ts.map +1 -0
- package/dist/observability/slowQueryAlert.js +67 -0
- package/dist/observability/slowQueryAlert.js.map +1 -0
- package/dist/observability/zeroResultTriage.d.ts +22 -0
- package/dist/observability/zeroResultTriage.d.ts.map +1 -0
- package/dist/observability/zeroResultTriage.js +116 -0
- package/dist/observability/zeroResultTriage.js.map +1 -0
- package/dist/search/embeddings.d.ts +31 -0
- package/dist/search/embeddings.d.ts.map +1 -0
- package/dist/search/embeddings.js +91 -0
- package/dist/search/embeddings.js.map +1 -0
- package/dist/search/fileWatcher.d.ts +28 -0
- package/dist/search/fileWatcher.d.ts.map +1 -0
- package/dist/search/fileWatcher.js +103 -0
- package/dist/search/fileWatcher.js.map +1 -0
- package/dist/search/hotQueryCache.d.ts +31 -0
- package/dist/search/hotQueryCache.d.ts.map +1 -0
- package/dist/search/hotQueryCache.js +103 -0
- package/dist/search/hotQueryCache.js.map +1 -0
- package/dist/search/postgresIndex.d.ts +439 -0
- package/dist/search/postgresIndex.d.ts.map +1 -0
- package/dist/search/postgresIndex.js +1610 -0
- package/dist/search/postgresIndex.js.map +1 -0
- package/dist/search/sqliteIndex.d.ts +66 -0
- package/dist/search/sqliteIndex.d.ts.map +1 -0
- package/dist/search/sqliteIndex.js +342 -0
- package/dist/search/sqliteIndex.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +532 -0
- package/dist/server.js.map +1 -0
- package/dist/session/bundle.d.ts +53 -0
- package/dist/session/bundle.d.ts.map +1 -0
- package/dist/session/bundle.js +97 -0
- package/dist/session/bundle.js.map +1 -0
- package/dist/storage/client.d.ts +157 -0
- package/dist/storage/client.d.ts.map +1 -0
- package/dist/storage/client.js +825 -0
- package/dist/storage/client.js.map +1 -0
- package/dist/tools/addWebhookPattern.d.ts +15 -0
- package/dist/tools/addWebhookPattern.d.ts.map +1 -0
- package/dist/tools/addWebhookPattern.js +15 -0
- package/dist/tools/addWebhookPattern.js.map +1 -0
- package/dist/tools/appendLog.d.ts +18 -0
- package/dist/tools/appendLog.d.ts.map +1 -0
- package/dist/tools/appendLog.js +18 -0
- package/dist/tools/appendLog.js.map +1 -0
- package/dist/tools/auditIndex.d.ts +15 -0
- package/dist/tools/auditIndex.d.ts.map +1 -0
- package/dist/tools/auditIndex.js +165 -0
- package/dist/tools/auditIndex.js.map +1 -0
- package/dist/tools/batchDeletePages.d.ts +18 -0
- package/dist/tools/batchDeletePages.d.ts.map +1 -0
- package/dist/tools/batchDeletePages.js +143 -0
- package/dist/tools/batchDeletePages.js.map +1 -0
- package/dist/tools/coerce.d.ts +3 -0
- package/dist/tools/coerce.d.ts.map +1 -0
- package/dist/tools/coerce.js +12 -0
- package/dist/tools/coerce.js.map +1 -0
- package/dist/tools/createPage.d.ts +24 -0
- package/dist/tools/createPage.d.ts.map +1 -0
- package/dist/tools/createPage.js +99 -0
- package/dist/tools/createPage.js.map +1 -0
- package/dist/tools/createPages.d.ts +51 -0
- package/dist/tools/createPages.d.ts.map +1 -0
- package/dist/tools/createPages.js +91 -0
- package/dist/tools/createPages.js.map +1 -0
- package/dist/tools/deletePage.d.ts +19 -0
- package/dist/tools/deletePage.d.ts.map +1 -0
- package/dist/tools/deletePage.js +127 -0
- package/dist/tools/deletePage.js.map +1 -0
- package/dist/tools/exportWiki.d.ts +48 -0
- package/dist/tools/exportWiki.d.ts.map +1 -0
- package/dist/tools/exportWiki.js +233 -0
- package/dist/tools/exportWiki.js.map +1 -0
- package/dist/tools/extractLinks.d.ts +14 -0
- package/dist/tools/extractLinks.d.ts.map +1 -0
- package/dist/tools/extractLinks.js +25 -0
- package/dist/tools/extractLinks.js.map +1 -0
- package/dist/tools/generateClaudeInstructions.d.ts +27 -0
- package/dist/tools/generateClaudeInstructions.d.ts.map +1 -0
- package/dist/tools/generateClaudeInstructions.js +263 -0
- package/dist/tools/generateClaudeInstructions.js.map +1 -0
- package/dist/tools/generateGptInstructions.d.ts +27 -0
- package/dist/tools/generateGptInstructions.d.ts.map +1 -0
- package/dist/tools/generateGptInstructions.js +208 -0
- package/dist/tools/generateGptInstructions.js.map +1 -0
- package/dist/tools/getBacklinks.d.ts +12 -0
- package/dist/tools/getBacklinks.d.ts.map +1 -0
- package/dist/tools/getBacklinks.js +13 -0
- package/dist/tools/getBacklinks.js.map +1 -0
- package/dist/tools/getRelated.d.ts +12 -0
- package/dist/tools/getRelated.d.ts.map +1 -0
- package/dist/tools/getRelated.js +13 -0
- package/dist/tools/getRelated.js.map +1 -0
- package/dist/tools/healthCheck.d.ts +5 -0
- package/dist/tools/healthCheck.d.ts.map +1 -0
- package/dist/tools/healthCheck.js +167 -0
- package/dist/tools/healthCheck.js.map +1 -0
- package/dist/tools/importBrainSource.d.ts +36 -0
- package/dist/tools/importBrainSource.d.ts.map +1 -0
- package/dist/tools/importBrainSource.js +314 -0
- package/dist/tools/importBrainSource.js.map +1 -0
- package/dist/tools/importWikiZip.d.ts +60 -0
- package/dist/tools/importWikiZip.d.ts.map +1 -0
- package/dist/tools/importWikiZip.js +379 -0
- package/dist/tools/importWikiZip.js.map +1 -0
- package/dist/tools/initProject.d.ts +34 -0
- package/dist/tools/initProject.d.ts.map +1 -0
- package/dist/tools/initProject.js +443 -0
- package/dist/tools/initProject.js.map +1 -0
- package/dist/tools/instructionContext.d.ts +60 -0
- package/dist/tools/instructionContext.d.ts.map +1 -0
- package/dist/tools/instructionContext.js +210 -0
- package/dist/tools/instructionContext.js.map +1 -0
- package/dist/tools/listArchivedPages.d.ts +17 -0
- package/dist/tools/listArchivedPages.d.ts.map +1 -0
- package/dist/tools/listArchivedPages.js +51 -0
- package/dist/tools/listArchivedPages.js.map +1 -0
- package/dist/tools/listPages.d.ts +28 -0
- package/dist/tools/listPages.d.ts.map +1 -0
- package/dist/tools/listPages.js +166 -0
- package/dist/tools/listPages.js.map +1 -0
- package/dist/tools/listWebhooks.d.ts +7 -0
- package/dist/tools/listWebhooks.d.ts.map +1 -0
- package/dist/tools/listWebhooks.js +10 -0
- package/dist/tools/listWebhooks.js.map +1 -0
- package/dist/tools/movePage.d.ts +18 -0
- package/dist/tools/movePage.d.ts.map +1 -0
- package/dist/tools/movePage.js +182 -0
- package/dist/tools/movePage.js.map +1 -0
- package/dist/tools/pageHistory.d.ts +36 -0
- package/dist/tools/pageHistory.d.ts.map +1 -0
- package/dist/tools/pageHistory.js +60 -0
- package/dist/tools/pageHistory.js.map +1 -0
- package/dist/tools/patchPage.d.ts +141 -0
- package/dist/tools/patchPage.d.ts.map +1 -0
- package/dist/tools/patchPage.js +287 -0
- package/dist/tools/patchPage.js.map +1 -0
- package/dist/tools/pullSessionBundle.d.ts +34 -0
- package/dist/tools/pullSessionBundle.d.ts.map +1 -0
- package/dist/tools/pullSessionBundle.js +432 -0
- package/dist/tools/pullSessionBundle.js.map +1 -0
- package/dist/tools/purgeWiki.d.ts +23 -0
- package/dist/tools/purgeWiki.d.ts.map +1 -0
- package/dist/tools/purgeWiki.js +113 -0
- package/dist/tools/purgeWiki.js.map +1 -0
- package/dist/tools/pushSessionBundle.d.ts +139 -0
- package/dist/tools/pushSessionBundle.d.ts.map +1 -0
- package/dist/tools/pushSessionBundle.js +282 -0
- package/dist/tools/pushSessionBundle.js.map +1 -0
- package/dist/tools/readGovernanceAudit.d.ts +17 -0
- package/dist/tools/readGovernanceAudit.d.ts.map +1 -0
- package/dist/tools/readGovernanceAudit.js +21 -0
- package/dist/tools/readGovernanceAudit.js.map +1 -0
- package/dist/tools/readPage.d.ts +13 -0
- package/dist/tools/readPage.d.ts.map +1 -0
- package/dist/tools/readPage.js +46 -0
- package/dist/tools/readPage.js.map +1 -0
- package/dist/tools/removeWebhook.d.ts +14 -0
- package/dist/tools/removeWebhook.d.ts.map +1 -0
- package/dist/tools/removeWebhook.js +12 -0
- package/dist/tools/removeWebhook.js.map +1 -0
- package/dist/tools/resolveProject.d.ts +58 -0
- package/dist/tools/resolveProject.d.ts.map +1 -0
- package/dist/tools/resolveProject.js +175 -0
- package/dist/tools/resolveProject.js.map +1 -0
- package/dist/tools/restorePage.d.ts +47 -0
- package/dist/tools/restorePage.d.ts.map +1 -0
- package/dist/tools/restorePage.js +111 -0
- package/dist/tools/restorePage.js.map +1 -0
- package/dist/tools/searchPages.d.ts +28 -0
- package/dist/tools/searchPages.d.ts.map +1 -0
- package/dist/tools/searchPages.js +372 -0
- package/dist/tools/searchPages.js.map +1 -0
- package/dist/tools/setWebhook.d.ts +30 -0
- package/dist/tools/setWebhook.d.ts.map +1 -0
- package/dist/tools/setWebhook.js +30 -0
- package/dist/tools/setWebhook.js.map +1 -0
- package/dist/tools/shareProject.d.ts +25 -0
- package/dist/tools/shareProject.d.ts.map +1 -0
- package/dist/tools/shareProject.js +56 -0
- package/dist/tools/shareProject.js.map +1 -0
- package/dist/tools/suggestLinks.d.ts +29 -0
- package/dist/tools/suggestLinks.d.ts.map +1 -0
- package/dist/tools/suggestLinks.js +214 -0
- package/dist/tools/suggestLinks.js.map +1 -0
- package/dist/tools/updatePage.d.ts +27 -0
- package/dist/tools/updatePage.d.ts.map +1 -0
- package/dist/tools/updatePage.js +118 -0
- package/dist/tools/updatePage.js.map +1 -0
- package/dist/webhooks/dispatch.d.ts +49 -0
- package/dist/webhooks/dispatch.d.ts.map +1 -0
- package/dist/webhooks/dispatch.js +159 -0
- package/dist/webhooks/dispatch.js.map +1 -0
- package/dist/webhooks/webhookRules.d.ts +34 -0
- package/dist/webhooks/webhookRules.d.ts.map +1 -0
- package/dist/webhooks/webhookRules.js +129 -0
- package/dist/webhooks/webhookRules.js.map +1 -0
- package/dist/wiki/frontmatter.d.ts +45 -0
- package/dist/wiki/frontmatter.d.ts.map +1 -0
- package/dist/wiki/frontmatter.js +68 -0
- package/dist/wiki/frontmatter.js.map +1 -0
- package/dist/wiki/index.d.ts +22 -0
- package/dist/wiki/index.d.ts.map +1 -0
- package/dist/wiki/index.js +203 -0
- package/dist/wiki/index.js.map +1 -0
- package/dist/wiki/ingestPolicy.d.ts +18 -0
- package/dist/wiki/ingestPolicy.d.ts.map +1 -0
- package/dist/wiki/ingestPolicy.js +64 -0
- package/dist/wiki/ingestPolicy.js.map +1 -0
- package/dist/wiki/layoutLint.d.ts +51 -0
- package/dist/wiki/layoutLint.d.ts.map +1 -0
- package/dist/wiki/layoutLint.js +146 -0
- package/dist/wiki/layoutLint.js.map +1 -0
- package/dist/wiki/links.d.ts +6 -0
- package/dist/wiki/links.d.ts.map +1 -0
- package/dist/wiki/links.js +45 -0
- package/dist/wiki/links.js.map +1 -0
- package/dist/wiki/log.d.ts +58 -0
- package/dist/wiki/log.d.ts.map +1 -0
- package/dist/wiki/log.js +126 -0
- package/dist/wiki/log.js.map +1 -0
- package/dist/wiki/path.d.ts +8 -0
- package/dist/wiki/path.d.ts.map +1 -0
- package/dist/wiki/path.js +25 -0
- package/dist/wiki/path.js.map +1 -0
- package/dist/wiki/storageLimits.d.ts +163 -0
- package/dist/wiki/storageLimits.d.ts.map +1 -0
- package/dist/wiki/storageLimits.js +281 -0
- package/dist/wiki/storageLimits.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,942 @@
|
|
|
1
|
+
import { getVisibleTools } from "../server.js";
|
|
2
|
+
function makeToolSummary(name) {
|
|
3
|
+
return name
|
|
4
|
+
.split("_")
|
|
5
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
6
|
+
.join(" ");
|
|
7
|
+
}
|
|
8
|
+
function resolveServerUrl() {
|
|
9
|
+
const value = process.env.BRAINS_BASE_URL?.trim() ||
|
|
10
|
+
process.env.BRAINS_PUBLIC_BASE_URL?.trim() ||
|
|
11
|
+
process.env.API_BASE_URL?.trim() ||
|
|
12
|
+
"";
|
|
13
|
+
if (!value)
|
|
14
|
+
return "/";
|
|
15
|
+
return value.replace(/\/$/, "");
|
|
16
|
+
}
|
|
17
|
+
function resolveAbsoluteUrl(pathname) {
|
|
18
|
+
const base = resolveServerUrl();
|
|
19
|
+
if (base === "/")
|
|
20
|
+
return pathname;
|
|
21
|
+
return `${base}${pathname}`;
|
|
22
|
+
}
|
|
23
|
+
export function buildOpenApiSpec() {
|
|
24
|
+
const visibleTools = getVisibleTools();
|
|
25
|
+
const toolSchemas = Object.fromEntries(visibleTools.map((tool) => [
|
|
26
|
+
`${tool.name}Input`,
|
|
27
|
+
tool.inputSchema,
|
|
28
|
+
]));
|
|
29
|
+
return {
|
|
30
|
+
openapi: "3.1.0",
|
|
31
|
+
info: {
|
|
32
|
+
title: "brains Wiki API",
|
|
33
|
+
version: "1.0.0",
|
|
34
|
+
description: "API-first interface for the brains second-brain wiki. OAuth 2.0 authorization-code flow is designed for ChatGPT Actions and Claude integrations.",
|
|
35
|
+
},
|
|
36
|
+
servers: [{ url: resolveServerUrl() }],
|
|
37
|
+
security: [{ ApiKeyAuth: [] }, { OAuth2: ["wiki.read", "wiki.write"] }],
|
|
38
|
+
tags: [
|
|
39
|
+
{ name: "Auth" },
|
|
40
|
+
{ name: "Wiki" },
|
|
41
|
+
{ name: "Session" },
|
|
42
|
+
{ name: "Tools" },
|
|
43
|
+
{ name: "Health" },
|
|
44
|
+
{ name: "Discovery" },
|
|
45
|
+
],
|
|
46
|
+
paths: {
|
|
47
|
+
"/": {
|
|
48
|
+
get: {
|
|
49
|
+
tags: ["Discovery"],
|
|
50
|
+
summary: "Service metadata",
|
|
51
|
+
security: [],
|
|
52
|
+
responses: {
|
|
53
|
+
"200": {
|
|
54
|
+
description: "Service information",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
"/openapi.json": {
|
|
60
|
+
get: {
|
|
61
|
+
tags: ["Discovery"],
|
|
62
|
+
summary: "OpenAPI document",
|
|
63
|
+
security: [],
|
|
64
|
+
responses: {
|
|
65
|
+
"200": {
|
|
66
|
+
description: "OpenAPI JSON",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
"/api/v1": {
|
|
72
|
+
get: {
|
|
73
|
+
tags: ["Discovery"],
|
|
74
|
+
summary: "API index (OpenAPI)",
|
|
75
|
+
description: "Returns the full OpenAPI spec. Equivalent to GET /openapi.json. Useful for agent discoverability — lists all routes including /import-zip/upload, /purge, and /tools/{name}.",
|
|
76
|
+
security: [],
|
|
77
|
+
responses: {
|
|
78
|
+
"200": {
|
|
79
|
+
description: "OpenAPI JSON",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
"/.well-known/oauth-authorization-server": {
|
|
85
|
+
get: {
|
|
86
|
+
tags: ["Discovery"],
|
|
87
|
+
summary: "OAuth authorization server metadata",
|
|
88
|
+
security: [],
|
|
89
|
+
responses: {
|
|
90
|
+
"200": {
|
|
91
|
+
description: "OAuth server discovery metadata",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
"/oauth/authorize": {
|
|
97
|
+
get: {
|
|
98
|
+
tags: ["Auth"],
|
|
99
|
+
summary: "OAuth authorization endpoint",
|
|
100
|
+
security: [],
|
|
101
|
+
parameters: [
|
|
102
|
+
{ name: "response_type", in: "query", required: true, schema: { type: "string", enum: ["code"] } },
|
|
103
|
+
{ name: "client_id", in: "query", required: true, schema: { type: "string" } },
|
|
104
|
+
{ name: "redirect_uri", in: "query", required: true, schema: { type: "string", format: "uri" } },
|
|
105
|
+
{ name: "scope", in: "query", required: false, schema: { type: "string" } },
|
|
106
|
+
{ name: "state", in: "query", required: false, schema: { type: "string" } },
|
|
107
|
+
{ name: "code_challenge", in: "query", required: false, schema: { type: "string" } },
|
|
108
|
+
{
|
|
109
|
+
name: "code_challenge_method",
|
|
110
|
+
in: "query",
|
|
111
|
+
required: false,
|
|
112
|
+
schema: { type: "string", enum: ["S256", "plain"] },
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
responses: {
|
|
116
|
+
"200": { description: "Consent/login UI" },
|
|
117
|
+
"302": { description: "Redirect with authorization code" },
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
post: {
|
|
121
|
+
tags: ["Auth"],
|
|
122
|
+
summary: "OAuth authorization form submit",
|
|
123
|
+
security: [],
|
|
124
|
+
requestBody: {
|
|
125
|
+
required: true,
|
|
126
|
+
content: {
|
|
127
|
+
"application/x-www-form-urlencoded": {
|
|
128
|
+
schema: {
|
|
129
|
+
type: "object",
|
|
130
|
+
required: ["username", "password", "client_id", "redirect_uri", "scope"],
|
|
131
|
+
properties: {
|
|
132
|
+
username: { type: "string" },
|
|
133
|
+
password: { type: "string" },
|
|
134
|
+
client_id: { type: "string" },
|
|
135
|
+
redirect_uri: { type: "string", format: "uri" },
|
|
136
|
+
scope: { type: "string" },
|
|
137
|
+
state: { type: "string" },
|
|
138
|
+
code_challenge: { type: "string" },
|
|
139
|
+
code_challenge_method: { type: "string", enum: ["S256", "plain"] },
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
responses: {
|
|
146
|
+
"302": { description: "Redirect with authorization code" },
|
|
147
|
+
"400": { description: "Invalid request" },
|
|
148
|
+
"401": { description: "Invalid user credentials" },
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
"/oauth/token": {
|
|
153
|
+
post: {
|
|
154
|
+
tags: ["Auth"],
|
|
155
|
+
summary: "OAuth token endpoint",
|
|
156
|
+
security: [],
|
|
157
|
+
requestBody: {
|
|
158
|
+
required: true,
|
|
159
|
+
content: {
|
|
160
|
+
"application/x-www-form-urlencoded": {
|
|
161
|
+
schema: {
|
|
162
|
+
type: "object",
|
|
163
|
+
required: ["grant_type"],
|
|
164
|
+
properties: {
|
|
165
|
+
grant_type: { type: "string", enum: ["authorization_code", "refresh_token"] },
|
|
166
|
+
code: { type: "string" },
|
|
167
|
+
redirect_uri: { type: "string", format: "uri" },
|
|
168
|
+
client_id: { type: "string" },
|
|
169
|
+
client_secret: {
|
|
170
|
+
type: "string",
|
|
171
|
+
description: "Required for confidential clients; omit for public PKCE clients.",
|
|
172
|
+
},
|
|
173
|
+
code_verifier: { type: "string" },
|
|
174
|
+
refresh_token: { type: "string" },
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
responses: {
|
|
181
|
+
"200": { description: "Access token response" },
|
|
182
|
+
"400": { description: "OAuth error" },
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
"/api/v1/health": {
|
|
187
|
+
get: {
|
|
188
|
+
tags: ["Health"],
|
|
189
|
+
summary: "Health check",
|
|
190
|
+
responses: {
|
|
191
|
+
"200": { description: "Health status" },
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
"/api/v1/launch/status": {
|
|
196
|
+
get: {
|
|
197
|
+
tags: ["Health"],
|
|
198
|
+
summary: "Launch spot counter",
|
|
199
|
+
description: "Returns remaining first-500 launch spots for the marketing pricing page. Result is cached for 60 seconds.",
|
|
200
|
+
responses: {
|
|
201
|
+
"200": {
|
|
202
|
+
description: "Launch status",
|
|
203
|
+
content: {
|
|
204
|
+
"application/json": {
|
|
205
|
+
schema: {
|
|
206
|
+
type: "object",
|
|
207
|
+
properties: {
|
|
208
|
+
spotsRemaining: { type: "number", description: "Launch spots left, floored at 0" },
|
|
209
|
+
offerOpen: { type: "boolean", description: "False once all 500 spots are claimed" },
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
"/api/v1/metrics": {
|
|
219
|
+
get: {
|
|
220
|
+
tags: ["Health"],
|
|
221
|
+
summary: "Request telemetry metrics",
|
|
222
|
+
description: "Aggregates request_events telemetry over a configurable time window. Requires wiki.read scope.",
|
|
223
|
+
parameters: [
|
|
224
|
+
{
|
|
225
|
+
name: "window",
|
|
226
|
+
in: "query",
|
|
227
|
+
schema: { type: "string", enum: ["1h", "6h", "24h", "7d"], default: "1h" },
|
|
228
|
+
description: "Aggregation window. Defaults to 1h.",
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
responses: {
|
|
232
|
+
"200": {
|
|
233
|
+
description: "Metrics aggregation",
|
|
234
|
+
content: {
|
|
235
|
+
"application/json": {
|
|
236
|
+
schema: {
|
|
237
|
+
type: "object",
|
|
238
|
+
properties: {
|
|
239
|
+
window: { type: "string" },
|
|
240
|
+
search: {
|
|
241
|
+
type: "object",
|
|
242
|
+
properties: {
|
|
243
|
+
p50: { type: "number" },
|
|
244
|
+
p95: { type: "number" },
|
|
245
|
+
p99: { type: "number" },
|
|
246
|
+
totalRequests: { type: "integer" },
|
|
247
|
+
errorRate: { type: "number" },
|
|
248
|
+
zeroResultRate: { type: "number" },
|
|
249
|
+
backendBreakdown: { type: "object", additionalProperties: { type: "number" } },
|
|
250
|
+
topQueries: { type: "array", items: { type: "string" } },
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
writes: {
|
|
254
|
+
type: "object",
|
|
255
|
+
properties: {
|
|
256
|
+
p50: { type: "number" },
|
|
257
|
+
p95: { type: "number" },
|
|
258
|
+
totalRequests: { type: "integer" },
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
overall: {
|
|
262
|
+
type: "object",
|
|
263
|
+
properties: {
|
|
264
|
+
p95: { type: "number" },
|
|
265
|
+
errorRate: { type: "number" },
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
"400": { description: "Invalid window parameter" },
|
|
274
|
+
"401": { description: "Missing or invalid authentication" },
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
"/api/v1/pages": {
|
|
279
|
+
get: {
|
|
280
|
+
tags: ["Wiki"],
|
|
281
|
+
summary: "List pages",
|
|
282
|
+
parameters: [
|
|
283
|
+
{ name: "tag", in: "query", schema: { type: "string" } },
|
|
284
|
+
{ name: "status", in: "query", schema: { type: "string", enum: ["active", "archived", "draft"] } },
|
|
285
|
+
],
|
|
286
|
+
responses: {
|
|
287
|
+
"200": { description: "Pages list" },
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
post: {
|
|
291
|
+
tags: ["Wiki"],
|
|
292
|
+
summary: "Create page",
|
|
293
|
+
requestBody: {
|
|
294
|
+
required: true,
|
|
295
|
+
content: {
|
|
296
|
+
"application/json": {
|
|
297
|
+
schema: { $ref: "#/components/schemas/create_pageInput" },
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
responses: {
|
|
302
|
+
"200": { description: "Create result" },
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
"/api/v1/pages/batch": {
|
|
307
|
+
post: {
|
|
308
|
+
tags: ["Wiki"],
|
|
309
|
+
summary: "Create pages batch",
|
|
310
|
+
requestBody: {
|
|
311
|
+
required: true,
|
|
312
|
+
content: {
|
|
313
|
+
"application/json": {
|
|
314
|
+
schema: { $ref: "#/components/schemas/create_pagesInput" },
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
responses: {
|
|
319
|
+
"200": { description: "Batch result" },
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
"/api/v1/pages/{name}/backlinks": {
|
|
324
|
+
get: {
|
|
325
|
+
tags: ["Wiki"],
|
|
326
|
+
summary: "List backlinks for a page",
|
|
327
|
+
parameters: [
|
|
328
|
+
{ name: "name", in: "path", required: true, schema: { type: "string" } },
|
|
329
|
+
{ name: "userId", in: "query", required: false, schema: { type: "string" }, description: "Admin (api-key) only: query a specific user's link graph." },
|
|
330
|
+
],
|
|
331
|
+
responses: {
|
|
332
|
+
"200": { description: "Backlink source pages" },
|
|
333
|
+
"403": { description: "userId override requires api-key authentication" },
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
"/api/v1/pages/{name}/related": {
|
|
338
|
+
get: {
|
|
339
|
+
tags: ["Wiki"],
|
|
340
|
+
summary: "List related pages (shared outbound targets)",
|
|
341
|
+
parameters: [
|
|
342
|
+
{ name: "name", in: "path", required: true, schema: { type: "string" } },
|
|
343
|
+
{ name: "userId", in: "query", required: false, schema: { type: "string" }, description: "Admin (api-key) only: query a specific user's link graph." },
|
|
344
|
+
],
|
|
345
|
+
responses: {
|
|
346
|
+
"200": { description: "Related pages" },
|
|
347
|
+
"403": { description: "userId override requires api-key authentication" },
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
"/api/v1/page": {
|
|
352
|
+
get: {
|
|
353
|
+
tags: ["Wiki"],
|
|
354
|
+
summary: "Read page",
|
|
355
|
+
parameters: [{ name: "name", in: "query", required: true, schema: { type: "string" } }],
|
|
356
|
+
responses: {
|
|
357
|
+
"200": { description: "Page" },
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
put: {
|
|
361
|
+
tags: ["Wiki"],
|
|
362
|
+
summary: "Update page (full rewrite)",
|
|
363
|
+
requestBody: {
|
|
364
|
+
required: true,
|
|
365
|
+
content: {
|
|
366
|
+
"application/json": {
|
|
367
|
+
schema: { $ref: "#/components/schemas/update_pageInput" },
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
responses: {
|
|
372
|
+
"200": { description: "Update result" },
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
patch: {
|
|
376
|
+
tags: ["Wiki"],
|
|
377
|
+
summary: "Patch page",
|
|
378
|
+
requestBody: {
|
|
379
|
+
required: true,
|
|
380
|
+
content: {
|
|
381
|
+
"application/json": {
|
|
382
|
+
schema: { $ref: "#/components/schemas/patch_pageInput" },
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
responses: {
|
|
387
|
+
"200": { description: "Patch result" },
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
"/api/v1/page/move": {
|
|
392
|
+
post: {
|
|
393
|
+
tags: ["Wiki"],
|
|
394
|
+
summary: "Archive or rename page",
|
|
395
|
+
requestBody: {
|
|
396
|
+
required: true,
|
|
397
|
+
content: {
|
|
398
|
+
"application/json": {
|
|
399
|
+
schema: { $ref: "#/components/schemas/move_pageInput" },
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
responses: {
|
|
404
|
+
"200": { description: "Move result" },
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
"/api/v1/search": {
|
|
409
|
+
get: {
|
|
410
|
+
tags: ["Wiki"],
|
|
411
|
+
summary: "Search pages",
|
|
412
|
+
parameters: [
|
|
413
|
+
{ name: "query", in: "query", required: true, schema: { type: "string" } },
|
|
414
|
+
{ name: "tag", in: "query", schema: { type: "string" } },
|
|
415
|
+
{ name: "maxCandidates", in: "query", schema: { type: "integer" } },
|
|
416
|
+
{ name: "maxResults", in: "query", schema: { type: "integer" } },
|
|
417
|
+
{ name: "maxConcurrency", in: "query", schema: { type: "integer" } },
|
|
418
|
+
],
|
|
419
|
+
responses: {
|
|
420
|
+
"200": { description: "Search result" },
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
"/api/v1/logs": {
|
|
425
|
+
post: {
|
|
426
|
+
tags: ["Wiki"],
|
|
427
|
+
summary: "Append log entry",
|
|
428
|
+
requestBody: {
|
|
429
|
+
required: true,
|
|
430
|
+
content: {
|
|
431
|
+
"application/json": {
|
|
432
|
+
schema: { $ref: "#/components/schemas/append_logInput" },
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
responses: {
|
|
437
|
+
"200": { description: "Log write result" },
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
"/api/v1/links/extract": {
|
|
442
|
+
post: {
|
|
443
|
+
tags: ["Wiki"],
|
|
444
|
+
summary: "Extract and index wiki links for stale pages",
|
|
445
|
+
description: "Processes only pages matching tags/folder filters where link metadata is missing or stale. Admin (api-key) callers may pass userId to backfill another user's pages.",
|
|
446
|
+
requestBody: {
|
|
447
|
+
required: true,
|
|
448
|
+
content: {
|
|
449
|
+
"application/json": {
|
|
450
|
+
schema: {
|
|
451
|
+
type: "object",
|
|
452
|
+
properties: {
|
|
453
|
+
tags: { type: "array", items: { type: "string" } },
|
|
454
|
+
folder: { type: "string" },
|
|
455
|
+
userId: { type: "string", description: "Admin (api-key) only: target a specific user's pages." },
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
responses: {
|
|
462
|
+
"200": { description: "Extraction summary" },
|
|
463
|
+
"400": { description: "Missing required filter parameter" },
|
|
464
|
+
"403": { description: "userId override requires api-key authentication" },
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
"/api/v1/links/suggest": {
|
|
469
|
+
post: {
|
|
470
|
+
tags: ["Wiki"],
|
|
471
|
+
summary: "Suggest cross-reference links for pages missing a Related pages section",
|
|
472
|
+
description: "Finds pages that lack a '## Related pages' section and returns ready-to-apply markdown patches suggesting cross-references. Uses the link graph when available; falls back to tag-overlap heuristics. Never writes — all patches require explicit review and confirmation.",
|
|
473
|
+
requestBody: {
|
|
474
|
+
required: true,
|
|
475
|
+
content: {
|
|
476
|
+
"application/json": {
|
|
477
|
+
schema: {
|
|
478
|
+
type: "object",
|
|
479
|
+
properties: {
|
|
480
|
+
tags: { type: "array", items: { type: "string" } },
|
|
481
|
+
folder: { type: "string" },
|
|
482
|
+
maxPages: { type: "number", description: "Maximum candidate pages to analyze (default 20, max 50)." },
|
|
483
|
+
},
|
|
484
|
+
},
|
|
485
|
+
},
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
responses: {
|
|
489
|
+
"200": { description: "Link suggestion result with patches" },
|
|
490
|
+
"400": { description: "Missing required filter parameter" },
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
"/api/v1/import": {
|
|
495
|
+
post: {
|
|
496
|
+
tags: ["Wiki"],
|
|
497
|
+
summary: "Import source brain documents",
|
|
498
|
+
requestBody: {
|
|
499
|
+
required: true,
|
|
500
|
+
content: {
|
|
501
|
+
"application/json": {
|
|
502
|
+
schema: { $ref: "#/components/schemas/import_brain_sourceInput" },
|
|
503
|
+
},
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
responses: {
|
|
507
|
+
"200": { description: "Import result" },
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
"/api/v1/export": {
|
|
512
|
+
post: {
|
|
513
|
+
tags: ["Wiki"],
|
|
514
|
+
summary: "Export wiki to ZIP archive",
|
|
515
|
+
requestBody: {
|
|
516
|
+
required: true,
|
|
517
|
+
content: {
|
|
518
|
+
"application/json": {
|
|
519
|
+
schema: { $ref: "#/components/schemas/export_wikiInput" },
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
responses: {
|
|
524
|
+
"200": { description: "Export result" },
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
"/api/v1/export/download": {
|
|
529
|
+
get: {
|
|
530
|
+
tags: ["Wiki"],
|
|
531
|
+
summary: "Download wiki export ZIP (async)",
|
|
532
|
+
description: "Enqueues a background export job and returns immediately. Poll GET /api/v1/jobs/{jobId} until status is 'done', then fetch the ZIP from GET /api/v1/jobs/{jobId}/download.",
|
|
533
|
+
parameters: [
|
|
534
|
+
{
|
|
535
|
+
name: "folder",
|
|
536
|
+
in: "query",
|
|
537
|
+
required: false,
|
|
538
|
+
schema: { type: "string" },
|
|
539
|
+
description: "Optional path prefix filter (e.g. projects/brainsapp).",
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
name: "tags",
|
|
543
|
+
in: "query",
|
|
544
|
+
required: false,
|
|
545
|
+
schema: { type: "string" },
|
|
546
|
+
description: "Optional comma-separated tags filter.",
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
name: "includeSystem",
|
|
550
|
+
in: "query",
|
|
551
|
+
required: false,
|
|
552
|
+
schema: { type: "boolean", default: false },
|
|
553
|
+
description: "Include system files (index.md, log.md). Defaults to false.",
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
name: "since",
|
|
557
|
+
in: "query",
|
|
558
|
+
required: false,
|
|
559
|
+
schema: { type: "string", format: "date-time" },
|
|
560
|
+
description: "ISO 8601 datetime — only include pages modified after this time (delta export).",
|
|
561
|
+
},
|
|
562
|
+
],
|
|
563
|
+
responses: {
|
|
564
|
+
"202": {
|
|
565
|
+
description: "Export job queued. Poll GET /api/v1/jobs/{jobId} for status, then GET /api/v1/jobs/{jobId}/download for the ZIP.",
|
|
566
|
+
content: {
|
|
567
|
+
"application/json": {
|
|
568
|
+
schema: {
|
|
569
|
+
type: "object",
|
|
570
|
+
properties: {
|
|
571
|
+
ok: { type: "boolean" },
|
|
572
|
+
jobId: { type: "string" },
|
|
573
|
+
status: { type: "string" },
|
|
574
|
+
pollUrl: { type: "string" },
|
|
575
|
+
downloadUrl: { type: "string" },
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
},
|
|
581
|
+
"400": { description: "Invalid query parameter" },
|
|
582
|
+
"401": { description: "Missing or invalid authentication" },
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
},
|
|
586
|
+
"/api/v1/import-zip": {
|
|
587
|
+
post: {
|
|
588
|
+
tags: ["Wiki"],
|
|
589
|
+
summary: "Import wiki from ZIP archive",
|
|
590
|
+
requestBody: {
|
|
591
|
+
required: true,
|
|
592
|
+
content: {
|
|
593
|
+
"application/json": {
|
|
594
|
+
schema: { $ref: "#/components/schemas/import_wikiInput" },
|
|
595
|
+
},
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
responses: {
|
|
599
|
+
"200": { description: "Import result" },
|
|
600
|
+
},
|
|
601
|
+
},
|
|
602
|
+
},
|
|
603
|
+
"/api/v1/import-zip/upload": {
|
|
604
|
+
post: {
|
|
605
|
+
tags: ["Wiki"],
|
|
606
|
+
summary: "Import wiki from uploaded ZIP bytes",
|
|
607
|
+
parameters: [
|
|
608
|
+
{
|
|
609
|
+
name: "execute",
|
|
610
|
+
in: "query",
|
|
611
|
+
required: false,
|
|
612
|
+
schema: { type: "boolean", default: true },
|
|
613
|
+
description: "If false, returns preview diff only. Defaults to true.",
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
name: "conflictStrategy",
|
|
617
|
+
in: "query",
|
|
618
|
+
required: false,
|
|
619
|
+
schema: { type: "string", enum: ["skip", "overwrite", "merge"], default: "merge" },
|
|
620
|
+
description: "Conflict handling strategy. Defaults to merge.",
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
name: "includeSystem",
|
|
624
|
+
in: "query",
|
|
625
|
+
required: false,
|
|
626
|
+
schema: { type: "boolean", default: false },
|
|
627
|
+
description: "Include system files (index.md, log.md). Defaults to false.",
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
name: "mode",
|
|
631
|
+
in: "query",
|
|
632
|
+
required: false,
|
|
633
|
+
schema: { type: "string", enum: ["additive", "replace"], default: "additive" },
|
|
634
|
+
description: "Import mode. replace mirrors ZIP and deletes pages missing from ZIP.",
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
name: "logTiming",
|
|
638
|
+
in: "query",
|
|
639
|
+
required: false,
|
|
640
|
+
schema: { type: "boolean", default: false },
|
|
641
|
+
description: "If true, appends a log entry to log.md after a successful execute run. Defaults to false.",
|
|
642
|
+
},
|
|
643
|
+
],
|
|
644
|
+
requestBody: {
|
|
645
|
+
required: true,
|
|
646
|
+
content: {
|
|
647
|
+
"application/zip": {
|
|
648
|
+
schema: { type: "string", format: "binary" },
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
responses: {
|
|
653
|
+
"202": {
|
|
654
|
+
description: "Job queued (both preview and execute). Poll GET /api/v1/jobs/{jobId} for result.",
|
|
655
|
+
content: {
|
|
656
|
+
"application/json": {
|
|
657
|
+
schema: {
|
|
658
|
+
type: "object",
|
|
659
|
+
properties: {
|
|
660
|
+
ok: { type: "boolean" },
|
|
661
|
+
jobId: { type: "string" },
|
|
662
|
+
status: { type: "string" },
|
|
663
|
+
pollUrl: { type: "string" },
|
|
664
|
+
},
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
"400": { description: "Invalid query parameter" },
|
|
670
|
+
"401": { description: "Missing or invalid authentication" },
|
|
671
|
+
"413": { description: "Payload too large" },
|
|
672
|
+
"415": { description: "Unsupported media type" },
|
|
673
|
+
},
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
"/api/v1/purge": {
|
|
677
|
+
post: {
|
|
678
|
+
tags: ["Wiki"],
|
|
679
|
+
summary: "Purge all wiki pages",
|
|
680
|
+
requestBody: {
|
|
681
|
+
required: true,
|
|
682
|
+
content: {
|
|
683
|
+
"application/json": {
|
|
684
|
+
schema: { $ref: "#/components/schemas/purge_wikiInput" },
|
|
685
|
+
},
|
|
686
|
+
},
|
|
687
|
+
},
|
|
688
|
+
responses: {
|
|
689
|
+
"200": { description: "Dry-run result (confirm=false)" },
|
|
690
|
+
"202": {
|
|
691
|
+
description: "Purge job queued (confirm=true). Poll GET /api/v1/jobs/{jobId} for result.",
|
|
692
|
+
content: {
|
|
693
|
+
"application/json": {
|
|
694
|
+
schema: {
|
|
695
|
+
type: "object",
|
|
696
|
+
properties: {
|
|
697
|
+
ok: { type: "boolean" },
|
|
698
|
+
jobId: { type: "string" },
|
|
699
|
+
status: { type: "string" },
|
|
700
|
+
pollUrl: { type: "string" },
|
|
701
|
+
},
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
|
+
},
|
|
705
|
+
},
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
},
|
|
709
|
+
"/api/v1/jobs/{jobId}": {
|
|
710
|
+
get: {
|
|
711
|
+
tags: ["Wiki"],
|
|
712
|
+
summary: "Get async job status and result",
|
|
713
|
+
parameters: [
|
|
714
|
+
{
|
|
715
|
+
name: "jobId",
|
|
716
|
+
in: "path",
|
|
717
|
+
required: true,
|
|
718
|
+
schema: { type: "string" },
|
|
719
|
+
description: "Job ID returned by an async import or purge endpoint.",
|
|
720
|
+
},
|
|
721
|
+
],
|
|
722
|
+
responses: {
|
|
723
|
+
"200": {
|
|
724
|
+
description: "Job status",
|
|
725
|
+
content: {
|
|
726
|
+
"application/json": {
|
|
727
|
+
schema: {
|
|
728
|
+
type: "object",
|
|
729
|
+
properties: {
|
|
730
|
+
ok: { type: "boolean" },
|
|
731
|
+
job: {
|
|
732
|
+
type: "object",
|
|
733
|
+
properties: {
|
|
734
|
+
id: { type: "string" },
|
|
735
|
+
kind: { type: "string", enum: ["import", "import-preview", "export", "purge"] },
|
|
736
|
+
status: { type: "string", enum: ["queued", "running", "done", "failed"] },
|
|
737
|
+
progress: {
|
|
738
|
+
type: "object",
|
|
739
|
+
properties: {
|
|
740
|
+
processed: { type: "integer" },
|
|
741
|
+
total: { type: "integer" },
|
|
742
|
+
phase: { type: "string" },
|
|
743
|
+
},
|
|
744
|
+
},
|
|
745
|
+
result: { type: "object" },
|
|
746
|
+
error: { type: "string" },
|
|
747
|
+
startedAt: { type: "string" },
|
|
748
|
+
completedAt: { type: "string" },
|
|
749
|
+
},
|
|
750
|
+
},
|
|
751
|
+
},
|
|
752
|
+
},
|
|
753
|
+
},
|
|
754
|
+
},
|
|
755
|
+
},
|
|
756
|
+
"401": { description: "Missing or invalid authentication" },
|
|
757
|
+
"404": { description: "Job not found or expired (jobs expire after 1 hour)" },
|
|
758
|
+
},
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
"/api/v1/jobs/{jobId}/download": {
|
|
762
|
+
get: {
|
|
763
|
+
tags: ["Wiki"],
|
|
764
|
+
summary: "Download the binary result of a completed async job",
|
|
765
|
+
parameters: [
|
|
766
|
+
{
|
|
767
|
+
name: "jobId",
|
|
768
|
+
in: "path",
|
|
769
|
+
required: true,
|
|
770
|
+
schema: { type: "string" },
|
|
771
|
+
description: "Job ID returned by an async export endpoint.",
|
|
772
|
+
},
|
|
773
|
+
],
|
|
774
|
+
responses: {
|
|
775
|
+
"200": {
|
|
776
|
+
description: "Binary file (e.g. ZIP archive for export jobs)",
|
|
777
|
+
content: {
|
|
778
|
+
"application/zip": {
|
|
779
|
+
schema: { type: "string", format: "binary" },
|
|
780
|
+
},
|
|
781
|
+
},
|
|
782
|
+
},
|
|
783
|
+
"401": { description: "Missing or invalid authentication" },
|
|
784
|
+
"404": { description: "Job not found, expired, or has no binary result" },
|
|
785
|
+
"409": { description: "Job is not yet done — poll /api/v1/jobs/{jobId} first" },
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
},
|
|
789
|
+
"/api/v1/session/bundle": {
|
|
790
|
+
get: {
|
|
791
|
+
tags: ["Session"],
|
|
792
|
+
summary: "Pull a filtered slice as a plain-text bundle",
|
|
793
|
+
description: "Returns pages matching the given tag or folder filter as a single plain-text bundle. At least one of 'tags' or 'folder' must be provided. Requires wiki.read scope.",
|
|
794
|
+
parameters: [
|
|
795
|
+
{
|
|
796
|
+
name: "tags",
|
|
797
|
+
in: "query",
|
|
798
|
+
required: false,
|
|
799
|
+
schema: { type: "string" },
|
|
800
|
+
description: "Comma-separated tag filter (e.g. 'brainsapp,open-loop'). Pages with any matching tag are included.",
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
name: "folder",
|
|
804
|
+
in: "query",
|
|
805
|
+
required: false,
|
|
806
|
+
schema: { type: "string" },
|
|
807
|
+
description: "Path prefix filter (e.g. 'projects/brainsapp'). Pages whose path starts with this prefix are included.",
|
|
808
|
+
},
|
|
809
|
+
],
|
|
810
|
+
responses: {
|
|
811
|
+
"200": {
|
|
812
|
+
description: "Bundle of matching pages as plain text",
|
|
813
|
+
headers: {
|
|
814
|
+
"X-Page-Count": {
|
|
815
|
+
schema: { type: "integer" },
|
|
816
|
+
description: "Number of pages included in the bundle",
|
|
817
|
+
},
|
|
818
|
+
"X-Session-Token": {
|
|
819
|
+
schema: { type: "string" },
|
|
820
|
+
description: "UUID identifying this session pull",
|
|
821
|
+
},
|
|
822
|
+
},
|
|
823
|
+
content: {
|
|
824
|
+
"text/plain": {
|
|
825
|
+
schema: { type: "string" },
|
|
826
|
+
},
|
|
827
|
+
},
|
|
828
|
+
},
|
|
829
|
+
"400": { description: "Missing required filter parameter" },
|
|
830
|
+
"401": { description: "Missing or invalid authentication" },
|
|
831
|
+
},
|
|
832
|
+
},
|
|
833
|
+
post: {
|
|
834
|
+
tags: ["Session"],
|
|
835
|
+
summary: "Push edited pages back from a bundle",
|
|
836
|
+
description: "Accepts a plain-text bundle (same format as GET response) and upserts each page into the wiki. Requires wiki.write scope.",
|
|
837
|
+
requestBody: {
|
|
838
|
+
required: true,
|
|
839
|
+
content: {
|
|
840
|
+
"text/plain": {
|
|
841
|
+
schema: { type: "string" },
|
|
842
|
+
},
|
|
843
|
+
},
|
|
844
|
+
},
|
|
845
|
+
responses: {
|
|
846
|
+
"200": {
|
|
847
|
+
description: "Upsert result",
|
|
848
|
+
content: {
|
|
849
|
+
"application/json": {
|
|
850
|
+
schema: {
|
|
851
|
+
type: "object",
|
|
852
|
+
properties: {
|
|
853
|
+
ok: { type: "boolean" },
|
|
854
|
+
updated: { type: "integer" },
|
|
855
|
+
created: { type: "integer" },
|
|
856
|
+
failed: {
|
|
857
|
+
type: "array",
|
|
858
|
+
items: {
|
|
859
|
+
type: "object",
|
|
860
|
+
properties: {
|
|
861
|
+
name: { type: "string" },
|
|
862
|
+
error: { type: "string" },
|
|
863
|
+
},
|
|
864
|
+
},
|
|
865
|
+
},
|
|
866
|
+
},
|
|
867
|
+
},
|
|
868
|
+
},
|
|
869
|
+
},
|
|
870
|
+
},
|
|
871
|
+
"400": { description: "Invalid bundle format" },
|
|
872
|
+
"401": { description: "Missing or invalid authentication" },
|
|
873
|
+
},
|
|
874
|
+
},
|
|
875
|
+
},
|
|
876
|
+
"/api/v1/tools": {
|
|
877
|
+
get: {
|
|
878
|
+
tags: ["Tools"],
|
|
879
|
+
summary: "List tool contracts",
|
|
880
|
+
responses: {
|
|
881
|
+
"200": { description: "Tool catalog" },
|
|
882
|
+
},
|
|
883
|
+
},
|
|
884
|
+
},
|
|
885
|
+
"/api/v1/tools/{name}": {
|
|
886
|
+
post: {
|
|
887
|
+
tags: ["Tools"],
|
|
888
|
+
summary: "Invoke any tool by name",
|
|
889
|
+
parameters: [{ name: "name", in: "path", required: true, schema: { type: "string" } }],
|
|
890
|
+
requestBody: {
|
|
891
|
+
required: true,
|
|
892
|
+
content: {
|
|
893
|
+
"application/json": {
|
|
894
|
+
schema: {
|
|
895
|
+
type: "object",
|
|
896
|
+
properties: {
|
|
897
|
+
arguments: { type: "object", additionalProperties: true },
|
|
898
|
+
},
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
},
|
|
902
|
+
},
|
|
903
|
+
responses: {
|
|
904
|
+
"200": { description: "Tool execution result" },
|
|
905
|
+
},
|
|
906
|
+
},
|
|
907
|
+
},
|
|
908
|
+
},
|
|
909
|
+
components: {
|
|
910
|
+
securitySchemes: {
|
|
911
|
+
OAuth2: {
|
|
912
|
+
type: "oauth2",
|
|
913
|
+
flows: {
|
|
914
|
+
authorizationCode: {
|
|
915
|
+
authorizationUrl: resolveAbsoluteUrl("/oauth/authorize"),
|
|
916
|
+
tokenUrl: resolveAbsoluteUrl("/oauth/token"),
|
|
917
|
+
scopes: {
|
|
918
|
+
"wiki.read": "Read wiki content and metadata",
|
|
919
|
+
"wiki.write": "Create, update, patch, and move wiki content",
|
|
920
|
+
},
|
|
921
|
+
},
|
|
922
|
+
},
|
|
923
|
+
},
|
|
924
|
+
ApiKeyAuth: {
|
|
925
|
+
type: "apiKey",
|
|
926
|
+
in: "header",
|
|
927
|
+
name: "x-api-key",
|
|
928
|
+
},
|
|
929
|
+
},
|
|
930
|
+
schemas: {
|
|
931
|
+
...toolSchemas,
|
|
932
|
+
},
|
|
933
|
+
},
|
|
934
|
+
"x-tools": visibleTools.map((tool) => ({
|
|
935
|
+
name: tool.name,
|
|
936
|
+
summary: makeToolSummary(tool.name),
|
|
937
|
+
description: tool.description,
|
|
938
|
+
inputSchema: tool.inputSchema,
|
|
939
|
+
})),
|
|
940
|
+
};
|
|
941
|
+
}
|
|
942
|
+
//# sourceMappingURL=openapi.js.map
|