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.
Files changed (350) hide show
  1. package/README.md +95 -0
  2. package/dist/access/projectShares.d.ts +48 -0
  3. package/dist/access/projectShares.d.ts.map +1 -0
  4. package/dist/access/projectShares.js +203 -0
  5. package/dist/access/projectShares.js.map +1 -0
  6. package/dist/access/sharedInstructionsNote.d.ts +37 -0
  7. package/dist/access/sharedInstructionsNote.d.ts.map +1 -0
  8. package/dist/access/sharedInstructionsNote.js +76 -0
  9. package/dist/access/sharedInstructionsNote.js.map +1 -0
  10. package/dist/admin/seedUsers.d.ts +23 -0
  11. package/dist/admin/seedUsers.d.ts.map +1 -0
  12. package/dist/admin/seedUsers.js +168 -0
  13. package/dist/admin/seedUsers.js.map +1 -0
  14. package/dist/api/openapi.d.ts +2 -0
  15. package/dist/api/openapi.d.ts.map +1 -0
  16. package/dist/api/openapi.js +942 -0
  17. package/dist/api/openapi.js.map +1 -0
  18. package/dist/auth/clientStore.d.ts +43 -0
  19. package/dist/auth/clientStore.d.ts.map +1 -0
  20. package/dist/auth/clientStore.js +168 -0
  21. package/dist/auth/clientStore.js.map +1 -0
  22. package/dist/auth/deleteAccount.d.ts +34 -0
  23. package/dist/auth/deleteAccount.d.ts.map +1 -0
  24. package/dist/auth/deleteAccount.js +203 -0
  25. package/dist/auth/deleteAccount.js.map +1 -0
  26. package/dist/auth/oauth.d.ts +118 -0
  27. package/dist/auth/oauth.d.ts.map +1 -0
  28. package/dist/auth/oauth.js +491 -0
  29. package/dist/auth/oauth.js.map +1 -0
  30. package/dist/auth/patStore.d.ts +87 -0
  31. package/dist/auth/patStore.d.ts.map +1 -0
  32. package/dist/auth/patStore.js +308 -0
  33. package/dist/auth/patStore.js.map +1 -0
  34. package/dist/auth/supabase.d.ts +15 -0
  35. package/dist/auth/supabase.d.ts.map +1 -0
  36. package/dist/auth/supabase.js +66 -0
  37. package/dist/auth/supabase.js.map +1 -0
  38. package/dist/auth/tokenStore.d.ts +73 -0
  39. package/dist/auth/tokenStore.d.ts.map +1 -0
  40. package/dist/auth/tokenStore.js +261 -0
  41. package/dist/auth/tokenStore.js.map +1 -0
  42. package/dist/backup/drive.d.ts +24 -0
  43. package/dist/backup/drive.d.ts.map +1 -0
  44. package/dist/backup/drive.js +70 -0
  45. package/dist/backup/drive.js.map +1 -0
  46. package/dist/billing/tierStore.d.ts +59 -0
  47. package/dist/billing/tierStore.d.ts.map +1 -0
  48. package/dist/billing/tierStore.js +152 -0
  49. package/dist/billing/tierStore.js.map +1 -0
  50. package/dist/digest/activityDigest.d.ts +32 -0
  51. package/dist/digest/activityDigest.d.ts.map +1 -0
  52. package/dist/digest/activityDigest.js +299 -0
  53. package/dist/digest/activityDigest.js.map +1 -0
  54. package/dist/digest/digestCron.d.ts +40 -0
  55. package/dist/digest/digestCron.d.ts.map +1 -0
  56. package/dist/digest/digestCron.js +146 -0
  57. package/dist/digest/digestCron.js.map +1 -0
  58. package/dist/digest/digestPreferences.d.ts +25 -0
  59. package/dist/digest/digestPreferences.d.ts.map +1 -0
  60. package/dist/digest/digestPreferences.js +79 -0
  61. package/dist/digest/digestPreferences.js.map +1 -0
  62. package/dist/digest/emailSender.d.ts +20 -0
  63. package/dist/digest/emailSender.d.ts.map +1 -0
  64. package/dist/digest/emailSender.js +35 -0
  65. package/dist/digest/emailSender.js.map +1 -0
  66. package/dist/drive/client.d.ts +43 -0
  67. package/dist/drive/client.d.ts.map +1 -0
  68. package/dist/drive/client.js +282 -0
  69. package/dist/drive/client.js.map +1 -0
  70. package/dist/drive/errors.d.ts +27 -0
  71. package/dist/drive/errors.d.ts.map +1 -0
  72. package/dist/drive/errors.js +51 -0
  73. package/dist/drive/errors.js.map +1 -0
  74. package/dist/drive/fileCache.d.ts +22 -0
  75. package/dist/drive/fileCache.d.ts.map +1 -0
  76. package/dist/drive/fileCache.js +57 -0
  77. package/dist/drive/fileCache.js.map +1 -0
  78. package/dist/governance/accessControl.d.ts +87 -0
  79. package/dist/governance/accessControl.d.ts.map +1 -0
  80. package/dist/governance/accessControl.js +179 -0
  81. package/dist/governance/accessControl.js.map +1 -0
  82. package/dist/html/components.d.ts +8 -0
  83. package/dist/html/components.d.ts.map +1 -0
  84. package/dist/html/components.js +19 -0
  85. package/dist/html/components.js.map +1 -0
  86. package/dist/html/layout.d.ts +7 -0
  87. package/dist/html/layout.d.ts.map +1 -0
  88. package/dist/html/layout.js +24 -0
  89. package/dist/html/layout.js.map +1 -0
  90. package/dist/html/metricsUi.d.ts +8 -0
  91. package/dist/html/metricsUi.d.ts.map +1 -0
  92. package/dist/html/metricsUi.js +271 -0
  93. package/dist/html/metricsUi.js.map +1 -0
  94. package/dist/httpServer.d.ts +19 -0
  95. package/dist/httpServer.d.ts.map +1 -0
  96. package/dist/httpServer.js +3913 -0
  97. package/dist/httpServer.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +40 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/jobs/asyncJobRegistry.d.ts +30 -0
  103. package/dist/jobs/asyncJobRegistry.d.ts.map +1 -0
  104. package/dist/jobs/asyncJobRegistry.js +70 -0
  105. package/dist/jobs/asyncJobRegistry.js.map +1 -0
  106. package/dist/observability/metricsQuery.d.ts +41 -0
  107. package/dist/observability/metricsQuery.d.ts.map +1 -0
  108. package/dist/observability/metricsQuery.js +106 -0
  109. package/dist/observability/metricsQuery.js.map +1 -0
  110. package/dist/observability/relevanceSignal.d.ts +26 -0
  111. package/dist/observability/relevanceSignal.d.ts.map +1 -0
  112. package/dist/observability/relevanceSignal.js +95 -0
  113. package/dist/observability/relevanceSignal.js.map +1 -0
  114. package/dist/observability/requestEvents.d.ts +31 -0
  115. package/dist/observability/requestEvents.d.ts.map +1 -0
  116. package/dist/observability/requestEvents.js +54 -0
  117. package/dist/observability/requestEvents.js.map +1 -0
  118. package/dist/observability/slowQueryAlert.d.ts +25 -0
  119. package/dist/observability/slowQueryAlert.d.ts.map +1 -0
  120. package/dist/observability/slowQueryAlert.js +67 -0
  121. package/dist/observability/slowQueryAlert.js.map +1 -0
  122. package/dist/observability/zeroResultTriage.d.ts +22 -0
  123. package/dist/observability/zeroResultTriage.d.ts.map +1 -0
  124. package/dist/observability/zeroResultTriage.js +116 -0
  125. package/dist/observability/zeroResultTriage.js.map +1 -0
  126. package/dist/search/embeddings.d.ts +31 -0
  127. package/dist/search/embeddings.d.ts.map +1 -0
  128. package/dist/search/embeddings.js +91 -0
  129. package/dist/search/embeddings.js.map +1 -0
  130. package/dist/search/fileWatcher.d.ts +28 -0
  131. package/dist/search/fileWatcher.d.ts.map +1 -0
  132. package/dist/search/fileWatcher.js +103 -0
  133. package/dist/search/fileWatcher.js.map +1 -0
  134. package/dist/search/hotQueryCache.d.ts +31 -0
  135. package/dist/search/hotQueryCache.d.ts.map +1 -0
  136. package/dist/search/hotQueryCache.js +103 -0
  137. package/dist/search/hotQueryCache.js.map +1 -0
  138. package/dist/search/postgresIndex.d.ts +439 -0
  139. package/dist/search/postgresIndex.d.ts.map +1 -0
  140. package/dist/search/postgresIndex.js +1610 -0
  141. package/dist/search/postgresIndex.js.map +1 -0
  142. package/dist/search/sqliteIndex.d.ts +66 -0
  143. package/dist/search/sqliteIndex.d.ts.map +1 -0
  144. package/dist/search/sqliteIndex.js +342 -0
  145. package/dist/search/sqliteIndex.js.map +1 -0
  146. package/dist/server.d.ts +43 -0
  147. package/dist/server.d.ts.map +1 -0
  148. package/dist/server.js +532 -0
  149. package/dist/server.js.map +1 -0
  150. package/dist/session/bundle.d.ts +53 -0
  151. package/dist/session/bundle.d.ts.map +1 -0
  152. package/dist/session/bundle.js +97 -0
  153. package/dist/session/bundle.js.map +1 -0
  154. package/dist/storage/client.d.ts +157 -0
  155. package/dist/storage/client.d.ts.map +1 -0
  156. package/dist/storage/client.js +825 -0
  157. package/dist/storage/client.js.map +1 -0
  158. package/dist/tools/addWebhookPattern.d.ts +15 -0
  159. package/dist/tools/addWebhookPattern.d.ts.map +1 -0
  160. package/dist/tools/addWebhookPattern.js +15 -0
  161. package/dist/tools/addWebhookPattern.js.map +1 -0
  162. package/dist/tools/appendLog.d.ts +18 -0
  163. package/dist/tools/appendLog.d.ts.map +1 -0
  164. package/dist/tools/appendLog.js +18 -0
  165. package/dist/tools/appendLog.js.map +1 -0
  166. package/dist/tools/auditIndex.d.ts +15 -0
  167. package/dist/tools/auditIndex.d.ts.map +1 -0
  168. package/dist/tools/auditIndex.js +165 -0
  169. package/dist/tools/auditIndex.js.map +1 -0
  170. package/dist/tools/batchDeletePages.d.ts +18 -0
  171. package/dist/tools/batchDeletePages.d.ts.map +1 -0
  172. package/dist/tools/batchDeletePages.js +143 -0
  173. package/dist/tools/batchDeletePages.js.map +1 -0
  174. package/dist/tools/coerce.d.ts +3 -0
  175. package/dist/tools/coerce.d.ts.map +1 -0
  176. package/dist/tools/coerce.js +12 -0
  177. package/dist/tools/coerce.js.map +1 -0
  178. package/dist/tools/createPage.d.ts +24 -0
  179. package/dist/tools/createPage.d.ts.map +1 -0
  180. package/dist/tools/createPage.js +99 -0
  181. package/dist/tools/createPage.js.map +1 -0
  182. package/dist/tools/createPages.d.ts +51 -0
  183. package/dist/tools/createPages.d.ts.map +1 -0
  184. package/dist/tools/createPages.js +91 -0
  185. package/dist/tools/createPages.js.map +1 -0
  186. package/dist/tools/deletePage.d.ts +19 -0
  187. package/dist/tools/deletePage.d.ts.map +1 -0
  188. package/dist/tools/deletePage.js +127 -0
  189. package/dist/tools/deletePage.js.map +1 -0
  190. package/dist/tools/exportWiki.d.ts +48 -0
  191. package/dist/tools/exportWiki.d.ts.map +1 -0
  192. package/dist/tools/exportWiki.js +233 -0
  193. package/dist/tools/exportWiki.js.map +1 -0
  194. package/dist/tools/extractLinks.d.ts +14 -0
  195. package/dist/tools/extractLinks.d.ts.map +1 -0
  196. package/dist/tools/extractLinks.js +25 -0
  197. package/dist/tools/extractLinks.js.map +1 -0
  198. package/dist/tools/generateClaudeInstructions.d.ts +27 -0
  199. package/dist/tools/generateClaudeInstructions.d.ts.map +1 -0
  200. package/dist/tools/generateClaudeInstructions.js +263 -0
  201. package/dist/tools/generateClaudeInstructions.js.map +1 -0
  202. package/dist/tools/generateGptInstructions.d.ts +27 -0
  203. package/dist/tools/generateGptInstructions.d.ts.map +1 -0
  204. package/dist/tools/generateGptInstructions.js +208 -0
  205. package/dist/tools/generateGptInstructions.js.map +1 -0
  206. package/dist/tools/getBacklinks.d.ts +12 -0
  207. package/dist/tools/getBacklinks.d.ts.map +1 -0
  208. package/dist/tools/getBacklinks.js +13 -0
  209. package/dist/tools/getBacklinks.js.map +1 -0
  210. package/dist/tools/getRelated.d.ts +12 -0
  211. package/dist/tools/getRelated.d.ts.map +1 -0
  212. package/dist/tools/getRelated.js +13 -0
  213. package/dist/tools/getRelated.js.map +1 -0
  214. package/dist/tools/healthCheck.d.ts +5 -0
  215. package/dist/tools/healthCheck.d.ts.map +1 -0
  216. package/dist/tools/healthCheck.js +167 -0
  217. package/dist/tools/healthCheck.js.map +1 -0
  218. package/dist/tools/importBrainSource.d.ts +36 -0
  219. package/dist/tools/importBrainSource.d.ts.map +1 -0
  220. package/dist/tools/importBrainSource.js +314 -0
  221. package/dist/tools/importBrainSource.js.map +1 -0
  222. package/dist/tools/importWikiZip.d.ts +60 -0
  223. package/dist/tools/importWikiZip.d.ts.map +1 -0
  224. package/dist/tools/importWikiZip.js +379 -0
  225. package/dist/tools/importWikiZip.js.map +1 -0
  226. package/dist/tools/initProject.d.ts +34 -0
  227. package/dist/tools/initProject.d.ts.map +1 -0
  228. package/dist/tools/initProject.js +443 -0
  229. package/dist/tools/initProject.js.map +1 -0
  230. package/dist/tools/instructionContext.d.ts +60 -0
  231. package/dist/tools/instructionContext.d.ts.map +1 -0
  232. package/dist/tools/instructionContext.js +210 -0
  233. package/dist/tools/instructionContext.js.map +1 -0
  234. package/dist/tools/listArchivedPages.d.ts +17 -0
  235. package/dist/tools/listArchivedPages.d.ts.map +1 -0
  236. package/dist/tools/listArchivedPages.js +51 -0
  237. package/dist/tools/listArchivedPages.js.map +1 -0
  238. package/dist/tools/listPages.d.ts +28 -0
  239. package/dist/tools/listPages.d.ts.map +1 -0
  240. package/dist/tools/listPages.js +166 -0
  241. package/dist/tools/listPages.js.map +1 -0
  242. package/dist/tools/listWebhooks.d.ts +7 -0
  243. package/dist/tools/listWebhooks.d.ts.map +1 -0
  244. package/dist/tools/listWebhooks.js +10 -0
  245. package/dist/tools/listWebhooks.js.map +1 -0
  246. package/dist/tools/movePage.d.ts +18 -0
  247. package/dist/tools/movePage.d.ts.map +1 -0
  248. package/dist/tools/movePage.js +182 -0
  249. package/dist/tools/movePage.js.map +1 -0
  250. package/dist/tools/pageHistory.d.ts +36 -0
  251. package/dist/tools/pageHistory.d.ts.map +1 -0
  252. package/dist/tools/pageHistory.js +60 -0
  253. package/dist/tools/pageHistory.js.map +1 -0
  254. package/dist/tools/patchPage.d.ts +141 -0
  255. package/dist/tools/patchPage.d.ts.map +1 -0
  256. package/dist/tools/patchPage.js +287 -0
  257. package/dist/tools/patchPage.js.map +1 -0
  258. package/dist/tools/pullSessionBundle.d.ts +34 -0
  259. package/dist/tools/pullSessionBundle.d.ts.map +1 -0
  260. package/dist/tools/pullSessionBundle.js +432 -0
  261. package/dist/tools/pullSessionBundle.js.map +1 -0
  262. package/dist/tools/purgeWiki.d.ts +23 -0
  263. package/dist/tools/purgeWiki.d.ts.map +1 -0
  264. package/dist/tools/purgeWiki.js +113 -0
  265. package/dist/tools/purgeWiki.js.map +1 -0
  266. package/dist/tools/pushSessionBundle.d.ts +139 -0
  267. package/dist/tools/pushSessionBundle.d.ts.map +1 -0
  268. package/dist/tools/pushSessionBundle.js +282 -0
  269. package/dist/tools/pushSessionBundle.js.map +1 -0
  270. package/dist/tools/readGovernanceAudit.d.ts +17 -0
  271. package/dist/tools/readGovernanceAudit.d.ts.map +1 -0
  272. package/dist/tools/readGovernanceAudit.js +21 -0
  273. package/dist/tools/readGovernanceAudit.js.map +1 -0
  274. package/dist/tools/readPage.d.ts +13 -0
  275. package/dist/tools/readPage.d.ts.map +1 -0
  276. package/dist/tools/readPage.js +46 -0
  277. package/dist/tools/readPage.js.map +1 -0
  278. package/dist/tools/removeWebhook.d.ts +14 -0
  279. package/dist/tools/removeWebhook.d.ts.map +1 -0
  280. package/dist/tools/removeWebhook.js +12 -0
  281. package/dist/tools/removeWebhook.js.map +1 -0
  282. package/dist/tools/resolveProject.d.ts +58 -0
  283. package/dist/tools/resolveProject.d.ts.map +1 -0
  284. package/dist/tools/resolveProject.js +175 -0
  285. package/dist/tools/resolveProject.js.map +1 -0
  286. package/dist/tools/restorePage.d.ts +47 -0
  287. package/dist/tools/restorePage.d.ts.map +1 -0
  288. package/dist/tools/restorePage.js +111 -0
  289. package/dist/tools/restorePage.js.map +1 -0
  290. package/dist/tools/searchPages.d.ts +28 -0
  291. package/dist/tools/searchPages.d.ts.map +1 -0
  292. package/dist/tools/searchPages.js +372 -0
  293. package/dist/tools/searchPages.js.map +1 -0
  294. package/dist/tools/setWebhook.d.ts +30 -0
  295. package/dist/tools/setWebhook.d.ts.map +1 -0
  296. package/dist/tools/setWebhook.js +30 -0
  297. package/dist/tools/setWebhook.js.map +1 -0
  298. package/dist/tools/shareProject.d.ts +25 -0
  299. package/dist/tools/shareProject.d.ts.map +1 -0
  300. package/dist/tools/shareProject.js +56 -0
  301. package/dist/tools/shareProject.js.map +1 -0
  302. package/dist/tools/suggestLinks.d.ts +29 -0
  303. package/dist/tools/suggestLinks.d.ts.map +1 -0
  304. package/dist/tools/suggestLinks.js +214 -0
  305. package/dist/tools/suggestLinks.js.map +1 -0
  306. package/dist/tools/updatePage.d.ts +27 -0
  307. package/dist/tools/updatePage.d.ts.map +1 -0
  308. package/dist/tools/updatePage.js +118 -0
  309. package/dist/tools/updatePage.js.map +1 -0
  310. package/dist/webhooks/dispatch.d.ts +49 -0
  311. package/dist/webhooks/dispatch.d.ts.map +1 -0
  312. package/dist/webhooks/dispatch.js +159 -0
  313. package/dist/webhooks/dispatch.js.map +1 -0
  314. package/dist/webhooks/webhookRules.d.ts +34 -0
  315. package/dist/webhooks/webhookRules.d.ts.map +1 -0
  316. package/dist/webhooks/webhookRules.js +129 -0
  317. package/dist/webhooks/webhookRules.js.map +1 -0
  318. package/dist/wiki/frontmatter.d.ts +45 -0
  319. package/dist/wiki/frontmatter.d.ts.map +1 -0
  320. package/dist/wiki/frontmatter.js +68 -0
  321. package/dist/wiki/frontmatter.js.map +1 -0
  322. package/dist/wiki/index.d.ts +22 -0
  323. package/dist/wiki/index.d.ts.map +1 -0
  324. package/dist/wiki/index.js +203 -0
  325. package/dist/wiki/index.js.map +1 -0
  326. package/dist/wiki/ingestPolicy.d.ts +18 -0
  327. package/dist/wiki/ingestPolicy.d.ts.map +1 -0
  328. package/dist/wiki/ingestPolicy.js +64 -0
  329. package/dist/wiki/ingestPolicy.js.map +1 -0
  330. package/dist/wiki/layoutLint.d.ts +51 -0
  331. package/dist/wiki/layoutLint.d.ts.map +1 -0
  332. package/dist/wiki/layoutLint.js +146 -0
  333. package/dist/wiki/layoutLint.js.map +1 -0
  334. package/dist/wiki/links.d.ts +6 -0
  335. package/dist/wiki/links.d.ts.map +1 -0
  336. package/dist/wiki/links.js +45 -0
  337. package/dist/wiki/links.js.map +1 -0
  338. package/dist/wiki/log.d.ts +58 -0
  339. package/dist/wiki/log.d.ts.map +1 -0
  340. package/dist/wiki/log.js +126 -0
  341. package/dist/wiki/log.js.map +1 -0
  342. package/dist/wiki/path.d.ts +8 -0
  343. package/dist/wiki/path.d.ts.map +1 -0
  344. package/dist/wiki/path.js +25 -0
  345. package/dist/wiki/path.js.map +1 -0
  346. package/dist/wiki/storageLimits.d.ts +163 -0
  347. package/dist/wiki/storageLimits.d.ts.map +1 -0
  348. package/dist/wiki/storageLimits.js +281 -0
  349. package/dist/wiki/storageLimits.js.map +1 -0
  350. 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"}