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,372 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parsePage } from "../wiki/frontmatter.js";
|
|
3
|
+
import { getSqliteSearchIndex } from "../search/sqliteIndex.js";
|
|
4
|
+
import { getPostgresSearchIndex, matchableTokens, tokenMatchesText, } from "../search/postgresIndex.js";
|
|
5
|
+
import { getHotCached, setHotCached } from "../search/hotQueryCache.js";
|
|
6
|
+
import { listActiveGrantsForGrantee } from "../access/projectShares.js";
|
|
7
|
+
import { DEFAULT_ACCESS_CONTEXT, isHiveModeEnabled, parseAccessLevel, parseAudience, pagePassesFilter, writeGovernanceAuditEntry, } from "../governance/accessControl.js";
|
|
8
|
+
export const searchPagesInputSchema = z.object({
|
|
9
|
+
query: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe("Keyword to search in page titles, summaries, and tags"),
|
|
12
|
+
tag: z.string().optional().describe("Filter by exact tag match (optional)"),
|
|
13
|
+
folder: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Restrict search to a single Lobe (folder prefix without trailing slash, e.g. 'projects/brainsapp'). " +
|
|
17
|
+
"Eliminates cross-Lobe noise at scale. Omit to search the full wiki."),
|
|
18
|
+
maxCandidates: z
|
|
19
|
+
.coerce
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(500)
|
|
24
|
+
.default(120)
|
|
25
|
+
.describe("Max index-matched candidate pages to read"),
|
|
26
|
+
maxResults: z
|
|
27
|
+
.coerce
|
|
28
|
+
.number()
|
|
29
|
+
.int()
|
|
30
|
+
.min(1)
|
|
31
|
+
.max(200)
|
|
32
|
+
.default(80)
|
|
33
|
+
.describe("Max results returned after ranking"),
|
|
34
|
+
maxConcurrency: z
|
|
35
|
+
.coerce
|
|
36
|
+
.number()
|
|
37
|
+
.int()
|
|
38
|
+
.min(1)
|
|
39
|
+
.max(32)
|
|
40
|
+
.default(8)
|
|
41
|
+
.describe("Max concurrent candidate file reads"),
|
|
42
|
+
});
|
|
43
|
+
const INDEX_CACHE_TTL = 60_000; // 60 s
|
|
44
|
+
let indexCache = null;
|
|
45
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
export async function searchPages(drive, input, userId = "", accessCtx = DEFAULT_ACCESS_CONTEXT) {
|
|
47
|
+
const backendMode = (process.env.SEARCH_BACKEND ?? "").toLowerCase();
|
|
48
|
+
const storageBackend = (process.env.STORAGE_BACKEND ?? "local").toLowerCase();
|
|
49
|
+
// ── Hot query cache check ────────────────────────────────────────────────
|
|
50
|
+
// Skip cache for scan-forced mode (typically debug/override scenarios).
|
|
51
|
+
if (backendMode !== "scan") {
|
|
52
|
+
const cached = getHotCached(userId, input.query);
|
|
53
|
+
if (cached) {
|
|
54
|
+
return { ...cached, cacheHit: true };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (backendMode === "scan") {
|
|
58
|
+
const scan = await searchPagesScan(drive, input, userId, accessCtx);
|
|
59
|
+
return { ...scan, backend: "scan", mode: "forced" };
|
|
60
|
+
}
|
|
61
|
+
// Use Postgres FTS (or hybrid) when storage is Supabase, unless explicitly overridden to sqlite.
|
|
62
|
+
if (storageBackend === "supabase" && backendMode !== "sqlite") {
|
|
63
|
+
const hybridEnabled = process.env.ENABLE_HYBRID_RETRIEVAL === "true";
|
|
64
|
+
const result = hybridEnabled
|
|
65
|
+
? await searchPagesHybrid(drive, input, userId, accessCtx)
|
|
66
|
+
: await searchPagesPostgres(drive, input, userId, accessCtx);
|
|
67
|
+
setHotCached(userId, input.query, result);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const totalStart = Date.now();
|
|
71
|
+
try {
|
|
72
|
+
const syncStart = Date.now();
|
|
73
|
+
const index = getSqliteSearchIndex(drive.getStorageLocation());
|
|
74
|
+
const indexSync = await index.ensureSynced(drive);
|
|
75
|
+
const syncMs = Date.now() - syncStart;
|
|
76
|
+
const queryResult = index.search({
|
|
77
|
+
query: input.query,
|
|
78
|
+
tag: input.tag,
|
|
79
|
+
maxCandidates: input.maxCandidates,
|
|
80
|
+
maxResults: input.maxResults,
|
|
81
|
+
});
|
|
82
|
+
const totalMs = Date.now() - totalStart;
|
|
83
|
+
const result = {
|
|
84
|
+
results: queryResult.results,
|
|
85
|
+
count: queryResult.totalMatches,
|
|
86
|
+
query: input.query,
|
|
87
|
+
indexCandidateCount: queryResult.candidateCount,
|
|
88
|
+
candidateReadCount: 0,
|
|
89
|
+
backend: "sqlite-fts",
|
|
90
|
+
indexSync,
|
|
91
|
+
timings: {
|
|
92
|
+
syncMs,
|
|
93
|
+
queryMs: queryResult.queryMs,
|
|
94
|
+
totalMs,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
setHotCached(userId, input.query, result);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const scan = await searchPagesScan(drive, input, userId, accessCtx);
|
|
102
|
+
return {
|
|
103
|
+
...scan,
|
|
104
|
+
backend: "scan-fallback",
|
|
105
|
+
fallbackReason: err instanceof Error ? err.message : String(err),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Active project-share grants (BRA-368) for `userId`, narrowed to those
|
|
111
|
+
* relevant to the requested `folder` (if any) so a folder-scoped search
|
|
112
|
+
* doesn't pull in unrelated shared projects.
|
|
113
|
+
*/
|
|
114
|
+
async function grantScopesFor(userId, folder) {
|
|
115
|
+
if (!userId)
|
|
116
|
+
return [];
|
|
117
|
+
// Strip any trailing slash before comparing — a raw trailing slash would
|
|
118
|
+
// double up in the startsWith checks below (e.g. "projects/" -> "projects//")
|
|
119
|
+
// and silently drop otherwise-matching grants (BRA-383 follow-up).
|
|
120
|
+
const normalizedFolder = folder ? folder.replace(/\/$/, "") : undefined;
|
|
121
|
+
const grants = await listActiveGrantsForGrantee(userId).catch(() => []);
|
|
122
|
+
return grants
|
|
123
|
+
.filter((g) => !normalizedFolder ||
|
|
124
|
+
g.project_path === normalizedFolder ||
|
|
125
|
+
g.project_path.startsWith(`${normalizedFolder}/`) ||
|
|
126
|
+
normalizedFolder.startsWith(`${g.project_path}/`))
|
|
127
|
+
.map((g) => ({ userId: g.owner_subject, folder: g.project_path }));
|
|
128
|
+
}
|
|
129
|
+
async function searchPagesPostgres(drive, input, userId = "", accessCtx = DEFAULT_ACCESS_CONTEXT) {
|
|
130
|
+
const queryStart = Date.now();
|
|
131
|
+
try {
|
|
132
|
+
const index = getPostgresSearchIndex();
|
|
133
|
+
const accessLevel = isHiveModeEnabled() ? accessCtx.userAccessLevel : undefined;
|
|
134
|
+
// Strip a trailing slash before it reaches postgresIndex's `like.<folder>/%`
|
|
135
|
+
// filter — a raw trailing slash doubles up into "folder//%", which never
|
|
136
|
+
// matches real page names and silently zeroes out folder-scoped search
|
|
137
|
+
// (BRA-383 follow-up).
|
|
138
|
+
const folder = input.folder?.replace(/\/$/, "");
|
|
139
|
+
const grantScopes = await grantScopesFor(userId, folder);
|
|
140
|
+
const result = await index.search({
|
|
141
|
+
query: input.query,
|
|
142
|
+
tag: input.tag,
|
|
143
|
+
folder,
|
|
144
|
+
maxResults: input.maxResults,
|
|
145
|
+
userId,
|
|
146
|
+
accessLevel,
|
|
147
|
+
grantScopes,
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
results: result.results,
|
|
151
|
+
count: result.totalMatches,
|
|
152
|
+
query: input.query,
|
|
153
|
+
indexCandidateCount: result.candidateCount,
|
|
154
|
+
candidateReadCount: 0,
|
|
155
|
+
backend: "postgres-fts",
|
|
156
|
+
timings: { queryMs: result.queryMs, totalMs: Date.now() - queryStart },
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
// Postgres query failed — fall back to a full scan so search still works
|
|
161
|
+
const scan = await searchPagesScan(drive, input, userId, accessCtx);
|
|
162
|
+
return {
|
|
163
|
+
...scan,
|
|
164
|
+
backend: "scan-fallback",
|
|
165
|
+
fallbackReason: err instanceof Error ? err.message : String(err),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function searchPagesHybrid(drive, input, userId = "", accessCtx = DEFAULT_ACCESS_CONTEXT) {
|
|
170
|
+
const queryStart = Date.now();
|
|
171
|
+
const index = getPostgresSearchIndex();
|
|
172
|
+
const accessLevel = isHiveModeEnabled() ? accessCtx.userAccessLevel : undefined;
|
|
173
|
+
const grantScopes = await grantScopesFor(userId, input.folder);
|
|
174
|
+
const opts = {
|
|
175
|
+
query: input.query,
|
|
176
|
+
tag: input.tag,
|
|
177
|
+
maxResults: input.maxResults,
|
|
178
|
+
userId,
|
|
179
|
+
accessLevel,
|
|
180
|
+
grantScopes,
|
|
181
|
+
};
|
|
182
|
+
try {
|
|
183
|
+
const hybrid = await index.searchHybrid(opts);
|
|
184
|
+
if (hybrid) {
|
|
185
|
+
return {
|
|
186
|
+
results: hybrid.results,
|
|
187
|
+
count: hybrid.totalMatches,
|
|
188
|
+
query: input.query,
|
|
189
|
+
indexCandidateCount: hybrid.totalMatches,
|
|
190
|
+
candidateReadCount: 0,
|
|
191
|
+
backend: "postgres-hybrid",
|
|
192
|
+
timings: { queryMs: hybrid.queryMs, totalMs: Date.now() - queryStart },
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// Hybrid function not deployed or embedding unavailable — fall through to FTS.
|
|
196
|
+
const fts = await searchPagesPostgres(drive, input, userId, accessCtx);
|
|
197
|
+
return { ...fts, hybridFallback: "no-embedding-or-function" };
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
// Any error degrades to FTS.
|
|
201
|
+
const fts = await searchPagesPostgres(drive, input, userId, accessCtx);
|
|
202
|
+
return {
|
|
203
|
+
...fts,
|
|
204
|
+
hybridFallback: err instanceof Error ? err.message : String(err),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function searchPagesScan(drive, input, userId = "", accessCtx = DEFAULT_ACCESS_CONTEXT) {
|
|
209
|
+
const totalStart = Date.now();
|
|
210
|
+
const q = input.query.trim().toLowerCase();
|
|
211
|
+
const indexStart = Date.now();
|
|
212
|
+
const indexEntries = await readIndexEntries(drive);
|
|
213
|
+
const indexLookupMs = Date.now() - indexStart;
|
|
214
|
+
const selectStart = Date.now();
|
|
215
|
+
const candidates = buildIndexCandidates(indexEntries, q, input.maxCandidates);
|
|
216
|
+
const candidateSelectMs = Date.now() - selectStart;
|
|
217
|
+
// Early cutoff: read at most maxResults*3 files, no fewer than 30
|
|
218
|
+
const cutoff = Math.min(candidates.length, Math.max(input.maxResults * 3, 30));
|
|
219
|
+
const candidatesToRead = candidates.slice(0, cutoff);
|
|
220
|
+
const readStart = Date.now();
|
|
221
|
+
const results = await readCandidatesConcurrent(drive, candidatesToRead, input.maxConcurrency, q, input.tag, userId, accessCtx);
|
|
222
|
+
const candidateReadMs = Date.now() - readStart;
|
|
223
|
+
const rankStart = Date.now();
|
|
224
|
+
const matchScore = (r) => (r.matchedOn.includes("title") ? 8 : 0) +
|
|
225
|
+
(r.matchedOn.includes("indexName") ? 6 : 0) +
|
|
226
|
+
(r.matchedOn.includes("tags") ? 4 : 0) +
|
|
227
|
+
(r.matchedOn.includes("indexSummary") ? 3 : 0) +
|
|
228
|
+
(r.matchedOn.includes("summary") ? 2 : 0) +
|
|
229
|
+
(r.matchedOn.includes("content") ? 1 : 0);
|
|
230
|
+
results.sort((a, b) => matchScore(b) - matchScore(a));
|
|
231
|
+
const rankMs = Date.now() - rankStart;
|
|
232
|
+
const totalMs = Date.now() - totalStart;
|
|
233
|
+
return {
|
|
234
|
+
results: results.slice(0, input.maxResults),
|
|
235
|
+
count: results.length,
|
|
236
|
+
query: input.query,
|
|
237
|
+
indexCandidateCount: candidates.length,
|
|
238
|
+
candidateReadCount: candidatesToRead.length,
|
|
239
|
+
timings: { indexLookupMs, candidateSelectMs, candidateReadMs, rankMs, totalMs },
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
async function readCandidatesConcurrent(drive, candidates, maxConcurrency, q, tagFilter, userId = "", accessCtx = DEFAULT_ACCESS_CONTEXT) {
|
|
243
|
+
const results = [];
|
|
244
|
+
let cursor = 0;
|
|
245
|
+
const hiveActive = isHiveModeEnabled();
|
|
246
|
+
const queryTokens = matchableTokens(q);
|
|
247
|
+
const worker = async () => {
|
|
248
|
+
while (cursor < candidates.length) {
|
|
249
|
+
const candidate = candidates[cursor++];
|
|
250
|
+
const name = candidate.name;
|
|
251
|
+
if (!name.endsWith(".md"))
|
|
252
|
+
continue;
|
|
253
|
+
try {
|
|
254
|
+
const driveFile = await drive.readFile(name);
|
|
255
|
+
const { frontmatter, content } = parsePage(driveFile.content);
|
|
256
|
+
if (hiveActive) {
|
|
257
|
+
const pageLevel = parseAccessLevel(frontmatter.access_level);
|
|
258
|
+
const pageAudience = parseAudience(frontmatter.audience);
|
|
259
|
+
if (!pagePassesFilter(pageLevel, pageAudience, accessCtx.userAccessLevel, accessCtx.sessionAudience)) {
|
|
260
|
+
writeGovernanceAuditEntry(userId, name, pageLevel, accessCtx.userAccessLevel, accessCtx.sessionAudience, pageLevel > accessCtx.userAccessLevel ? "access_level_exceeded" : "audience_mismatch");
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const matchedOn = [];
|
|
265
|
+
const title = String(frontmatter.title ?? "").toLowerCase();
|
|
266
|
+
const summary = String(frontmatter.summary ?? "").toLowerCase();
|
|
267
|
+
const tags = frontmatter.tags ?? [];
|
|
268
|
+
const contentLower = content.toLowerCase();
|
|
269
|
+
if (candidate.matchedOn.includes("indexName"))
|
|
270
|
+
matchedOn.push("indexName");
|
|
271
|
+
if (candidate.matchedOn.includes("indexSummary"))
|
|
272
|
+
matchedOn.push("indexSummary");
|
|
273
|
+
if (queryTokens.some((t) => tokenMatchesText(title, t)))
|
|
274
|
+
matchedOn.push("title");
|
|
275
|
+
if (queryTokens.some((t) => tokenMatchesText(summary, t)))
|
|
276
|
+
matchedOn.push("summary");
|
|
277
|
+
if (queryTokens.some((t) => tags.some((tag) => tokenMatchesText(tag.toLowerCase(), t))))
|
|
278
|
+
matchedOn.push("tags");
|
|
279
|
+
if (queryTokens.some((t) => tokenMatchesText(contentLower, t)))
|
|
280
|
+
matchedOn.push("content");
|
|
281
|
+
if (tagFilter && !tags.includes(tagFilter))
|
|
282
|
+
continue;
|
|
283
|
+
if (matchedOn.length > 0 || tagFilter) {
|
|
284
|
+
results.push({
|
|
285
|
+
name,
|
|
286
|
+
title: String(frontmatter.title ?? name),
|
|
287
|
+
summary: String(frontmatter.summary ?? ""),
|
|
288
|
+
updated: String(frontmatter.updated ?? ""),
|
|
289
|
+
matchedOn,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Skip unreadable files
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
await Promise.all(Array.from({ length: Math.min(maxConcurrency, candidates.length || 1) }, worker));
|
|
299
|
+
return results;
|
|
300
|
+
}
|
|
301
|
+
// ── Index reader with TTL + revision-aware cache ──────────────────────────────
|
|
302
|
+
async function readIndexEntries(drive) {
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
// Return cached entries if still fresh
|
|
305
|
+
if (indexCache && now - indexCache.cachedAt < INDEX_CACHE_TTL) {
|
|
306
|
+
return indexCache.entries;
|
|
307
|
+
}
|
|
308
|
+
const indexFile = await drive.readFile("index.md").catch(() => null);
|
|
309
|
+
if (!indexFile)
|
|
310
|
+
return [];
|
|
311
|
+
// Revision unchanged — just refresh timestamp, reuse parsed entries
|
|
312
|
+
if (indexCache && indexFile.revision === indexCache.revision) {
|
|
313
|
+
indexCache.cachedAt = now;
|
|
314
|
+
return indexCache.entries;
|
|
315
|
+
}
|
|
316
|
+
const entries = parseIndexEntries(indexFile.content);
|
|
317
|
+
indexCache = { entries, revision: indexFile.revision, cachedAt: now };
|
|
318
|
+
return entries;
|
|
319
|
+
}
|
|
320
|
+
function parseIndexEntries(content) {
|
|
321
|
+
const lines = content.split("\n");
|
|
322
|
+
const entries = [];
|
|
323
|
+
for (const line of lines) {
|
|
324
|
+
const trimmed = line.trim();
|
|
325
|
+
if (!trimmed.startsWith("|"))
|
|
326
|
+
continue;
|
|
327
|
+
if (trimmed.startsWith("|---"))
|
|
328
|
+
continue;
|
|
329
|
+
const cells = splitMarkdownRow(trimmed);
|
|
330
|
+
const pageCell = cells.length >= 4 ? cells[1] : cells[0];
|
|
331
|
+
const summaryCell = cells.length >= 4 ? cells[2] : cells[1] ?? "";
|
|
332
|
+
const nameMatch = pageCell?.match(/\[([^\]]+)\]\([^)]+\)/);
|
|
333
|
+
if (!nameMatch)
|
|
334
|
+
continue;
|
|
335
|
+
entries.push({
|
|
336
|
+
name: nameMatch[1],
|
|
337
|
+
summary: summaryCell.replace(/\\\|/g, "|"),
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
return entries;
|
|
341
|
+
}
|
|
342
|
+
function buildIndexCandidates(indexEntries, query, maxCandidates) {
|
|
343
|
+
const tokens = matchableTokens(query);
|
|
344
|
+
const ranked = indexEntries
|
|
345
|
+
.filter((e) => !e.name.startsWith("page-versions/"))
|
|
346
|
+
.map((e) => {
|
|
347
|
+
const name = e.name.toLowerCase();
|
|
348
|
+
const summary = e.summary.toLowerCase();
|
|
349
|
+
const matchedOn = [];
|
|
350
|
+
if (tokens.some((t) => tokenMatchesText(name, t)))
|
|
351
|
+
matchedOn.push("indexName");
|
|
352
|
+
if (tokens.some((t) => tokenMatchesText(summary, t)))
|
|
353
|
+
matchedOn.push("indexSummary");
|
|
354
|
+
return {
|
|
355
|
+
...e,
|
|
356
|
+
matchedOn,
|
|
357
|
+
rank: (matchedOn.includes("indexName") ? 6 : 0) +
|
|
358
|
+
(matchedOn.includes("indexSummary") ? 3 : 0),
|
|
359
|
+
};
|
|
360
|
+
})
|
|
361
|
+
.filter((e) => e.rank > 0)
|
|
362
|
+
.sort((a, b) => b.rank - a.rank || a.name.localeCompare(b.name));
|
|
363
|
+
return ranked.slice(0, maxCandidates);
|
|
364
|
+
}
|
|
365
|
+
function splitMarkdownRow(row) {
|
|
366
|
+
return row
|
|
367
|
+
.replace(/^\|/, "")
|
|
368
|
+
.replace(/\|$/, "")
|
|
369
|
+
.split(/(?<!\\)\|/)
|
|
370
|
+
.map((c) => c.trim());
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=searchPages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchPages.js","sourceRoot":"","sources":["../../src/tools/searchPages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type WebhookRule } from "../webhooks/webhookRules.js";
|
|
3
|
+
export declare const setWebhookInputSchema: z.ZodObject<{
|
|
4
|
+
id: z.ZodOptional<z.ZodString>;
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
url: z.ZodString;
|
|
7
|
+
patterns: z.ZodArray<z.ZodString, "many">;
|
|
8
|
+
events: z.ZodDefault<z.ZodArray<z.ZodEnum<["create", "update"]>, "many">>;
|
|
9
|
+
secret: z.ZodOptional<z.ZodString>;
|
|
10
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
name: string;
|
|
13
|
+
url: string;
|
|
14
|
+
events: ("create" | "update")[];
|
|
15
|
+
patterns: string[];
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
id?: string | undefined;
|
|
18
|
+
secret?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
name: string;
|
|
21
|
+
url: string;
|
|
22
|
+
patterns: string[];
|
|
23
|
+
id?: string | undefined;
|
|
24
|
+
secret?: string | undefined;
|
|
25
|
+
events?: ("create" | "update")[] | undefined;
|
|
26
|
+
enabled?: boolean | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type SetWebhookInput = z.infer<typeof setWebhookInputSchema>;
|
|
29
|
+
export declare function setWebhook(input: SetWebhookInput, userId: string): Promise<WebhookRule>;
|
|
30
|
+
//# sourceMappingURL=setWebhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setWebhook.d.ts","sourceRoot":"","sources":["../../src/tools/setWebhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAahC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAW7F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { upsertWebhookRule } from "../webhooks/webhookRules.js";
|
|
3
|
+
export const setWebhookInputSchema = z.object({
|
|
4
|
+
id: z.string().uuid().optional().describe("Existing webhook rule ID to update (omit to create new)"),
|
|
5
|
+
name: z.string().min(1).describe("Human-readable name for the webhook rule"),
|
|
6
|
+
url: z.string().url().describe("Target URL to POST to when a matching page is written"),
|
|
7
|
+
patterns: z
|
|
8
|
+
.array(z.string().min(1))
|
|
9
|
+
.describe("Glob or regex patterns to match page names against (e.g. 'projects/brainsapp/open-loop-*.md')"),
|
|
10
|
+
events: z
|
|
11
|
+
.array(z.enum(["create", "update"]))
|
|
12
|
+
.default(["create", "update"])
|
|
13
|
+
.describe("Which write events fire this webhook: 'create', 'update', or both"),
|
|
14
|
+
secret: z.string().optional().describe("HMAC-SHA256 signing secret — sets X-Brains-Signature header"),
|
|
15
|
+
enabled: z.boolean().default(true).describe("Set false to pause this rule without deleting it"),
|
|
16
|
+
});
|
|
17
|
+
export async function setWebhook(input, userId) {
|
|
18
|
+
if (!userId)
|
|
19
|
+
throw new Error("userId is required to manage webhook rules");
|
|
20
|
+
return upsertWebhookRule(userId, {
|
|
21
|
+
id: input.id,
|
|
22
|
+
name: input.name,
|
|
23
|
+
url: input.url,
|
|
24
|
+
secret: input.secret ?? "",
|
|
25
|
+
events: input.events,
|
|
26
|
+
patterns: input.patterns,
|
|
27
|
+
enabled: input.enabled,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=setWebhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setWebhook.js","sourceRoot":"","sources":["../../src/tools/setWebhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,6BAA6B,CAAC;AAElF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IACpG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC5E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACvF,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,CAAC,+FAA+F,CAAC;IAC5G,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;SACnC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC7B,QAAQ,CAAC,mEAAmE,CAAC;IAChF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IACrG,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAChG,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB,EAAE,MAAc;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC3E,OAAO,iBAAiB,CAAC,MAAM,EAAE;QAC/B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { StorageClient } from "../storage/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Internal-only tool (BRA-368): grant or revoke a named grantee's read+write
|
|
5
|
+
* access to one project (folder prefix) of the calling owner's own wiki.
|
|
6
|
+
* Deliberately NOT registered in TOOL_DEFINITIONS / getVisibleTools — it
|
|
7
|
+
* must never appear in ListTools, but remains callable via CallTool for
|
|
8
|
+
* agent-driven administration. See src/server.ts executeToolCall.
|
|
9
|
+
*/
|
|
10
|
+
export declare const shareProjectInputSchema: z.ZodObject<{
|
|
11
|
+
project_path: z.ZodString;
|
|
12
|
+
grantee: z.ZodString;
|
|
13
|
+
enabled: z.ZodBoolean;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
project_path: string;
|
|
17
|
+
grantee: string;
|
|
18
|
+
}, {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
project_path: string;
|
|
21
|
+
grantee: string;
|
|
22
|
+
}>;
|
|
23
|
+
export type ShareProjectInput = z.infer<typeof shareProjectInputSchema>;
|
|
24
|
+
export declare function shareProject(args: ShareProjectInput, ownerSubject: string, drive?: StorageClient): Promise<object>;
|
|
25
|
+
//# sourceMappingURL=shareProject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shareProject.d.ts","sourceRoot":"","sources":["../../src/tools/shareProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQ1D;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAIlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,wBAAsB,YAAY,CAChC,IAAI,EAAE,iBAAiB,EACvB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { normalizeProjectPath, resolveGranteeSubject, upsertProjectShare, } from "../access/projectShares.js";
|
|
3
|
+
import { syncSharedInstructionsNote } from "../access/sharedInstructionsNote.js";
|
|
4
|
+
/**
|
|
5
|
+
* Internal-only tool (BRA-368): grant or revoke a named grantee's read+write
|
|
6
|
+
* access to one project (folder prefix) of the calling owner's own wiki.
|
|
7
|
+
* Deliberately NOT registered in TOOL_DEFINITIONS / getVisibleTools — it
|
|
8
|
+
* must never appear in ListTools, but remains callable via CallTool for
|
|
9
|
+
* agent-driven administration. See src/server.ts executeToolCall.
|
|
10
|
+
*/
|
|
11
|
+
export const shareProjectInputSchema = z.object({
|
|
12
|
+
project_path: z.string().min(1).describe("Folder prefix to share, e.g. 'projects/5280'"),
|
|
13
|
+
grantee: z.string().min(1).describe("Existing grantee's email or Supabase subject/UUID"),
|
|
14
|
+
enabled: z.boolean().describe("true to grant/re-enable, false to revoke"),
|
|
15
|
+
});
|
|
16
|
+
export async function shareProject(args, ownerSubject, drive) {
|
|
17
|
+
if (!ownerSubject) {
|
|
18
|
+
throw new Error("share_project requires an authenticated owner (oauth/supabase/pat session)");
|
|
19
|
+
}
|
|
20
|
+
const projectPath = normalizeProjectPath(args.project_path);
|
|
21
|
+
const granteeSubject = await resolveGranteeSubject(args.grantee);
|
|
22
|
+
if (!granteeSubject) {
|
|
23
|
+
throw new Error(`No existing Brains user found for '${args.grantee}'. They must sign up first — pending/email invites are not supported yet.`);
|
|
24
|
+
}
|
|
25
|
+
if (granteeSubject === ownerSubject) {
|
|
26
|
+
throw new Error("Cannot share a project with yourself");
|
|
27
|
+
}
|
|
28
|
+
await upsertProjectShare({
|
|
29
|
+
owner_subject: ownerSubject,
|
|
30
|
+
project_path: projectPath,
|
|
31
|
+
grantee_subject: granteeSubject,
|
|
32
|
+
enabled: args.enabled,
|
|
33
|
+
});
|
|
34
|
+
// Best-effort (BRA-388): keep the project's own instructions in sync with
|
|
35
|
+
// its current sharing state — name active collaborators, establish
|
|
36
|
+
// shared-workspace filing rules, warn against sole-ownership assumptions.
|
|
37
|
+
// Never let this fail the underlying grant/revoke operation.
|
|
38
|
+
let sharedInstructionsSync = null;
|
|
39
|
+
if (drive) {
|
|
40
|
+
try {
|
|
41
|
+
sharedInstructionsSync = await syncSharedInstructionsNote(drive, ownerSubject, projectPath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* non-fatal */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
ok: true,
|
|
49
|
+
owner_subject: ownerSubject,
|
|
50
|
+
project_path: projectPath,
|
|
51
|
+
grantee_subject: granteeSubject,
|
|
52
|
+
enabled: args.enabled,
|
|
53
|
+
...(sharedInstructionsSync ? { sharedInstructionsSync } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=shareProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shareProject.js","sourceRoot":"","sources":["../../src/tools/shareProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IACxF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACxF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CAC1E,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAuB,EACvB,YAAoB,EACpB,KAAqB;IAErB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,sCAAsC,IAAI,CAAC,OAAO,2EAA2E,CAC9H,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,kBAAkB,CAAC;QACvB,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,cAAc;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IAEH,0EAA0E;IAC1E,mEAAmE;IACnE,0EAA0E;IAC1E,6DAA6D;IAC7D,IAAI,sBAAsB,GAA6E,IAAI,CAAC;IAC5G,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,sBAAsB,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,cAAc;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { StorageClient } from "../storage/client.js";
|
|
3
|
+
export declare const suggestLinksInputSchema: z.ZodObject<{
|
|
4
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
5
|
+
folder: z.ZodOptional<z.ZodString>;
|
|
6
|
+
maxPages: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
tags?: string[] | undefined;
|
|
9
|
+
folder?: string | undefined;
|
|
10
|
+
maxPages?: number | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
tags?: string[] | undefined;
|
|
13
|
+
folder?: string | undefined;
|
|
14
|
+
maxPages?: number | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export type SuggestLinksInput = z.infer<typeof suggestLinksInputSchema>;
|
|
17
|
+
interface LinkSuggestion {
|
|
18
|
+
name: string;
|
|
19
|
+
title: string;
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
export interface LinkPatch {
|
|
23
|
+
page: string;
|
|
24
|
+
suggestedLinks: LinkSuggestion[];
|
|
25
|
+
patch: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function suggestLinks(drive: StorageClient, input: SuggestLinksInput, userId?: string): Promise<object>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=suggestLinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestLinks.d.ts","sourceRoot":"","sources":["../../src/tools/suggestLinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAalC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AA8BD,wBAAsB,YAAY,CAChC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,iBAAiB,EACxB,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,CAAC,CA4KjB"}
|