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,97 @@
1
+ const DELIMITER_RE = /^===PAGE: (.+)===$/;
2
+ /**
3
+ * Combine an array of pages into a single bundle string.
4
+ * Each page is preceded by a delimiter line containing its name.
5
+ */
6
+ export function serializeBundle(pages) {
7
+ if (pages.length === 0)
8
+ return "";
9
+ return pages
10
+ .map(({ name, content }) => `===PAGE: ${name}===\n${content}`)
11
+ .join("\n");
12
+ }
13
+ /**
14
+ * Build the self-describing header prepended to a pulled bundle.
15
+ *
16
+ * The working-set contract already exists in seed/instructions and in the
17
+ * generated per-project instructions ("Do NOT call read_page on pages already
18
+ * in the bundle"). It was not reaching agents: tool descriptions are in context
19
+ * on every turn, wiki instruction pages only if the client loaded them, and an
20
+ * MCP client such as Claude Code never does. Meanwhile read_page's own
21
+ * description prescribes a "REQUIRED" list_pages -> read_page workflow with no
22
+ * bundle carve-out, so the contradiction resolved in favour of re-reading —
23
+ * measured at 10.04s of individual reads versus 3.47s for the same ten pages
24
+ * bundled (GH #426).
25
+ *
26
+ * Stating the contract inside the payload makes it independent of client,
27
+ * loaded instructions and context trimming: it arrives with the data.
28
+ *
29
+ * The header deliberately lists page names in a plain indented list rather than
30
+ * as `===PAGE: name===` lines. push_session_bundle's manifest parser locates
31
+ * pages with indexOf on that exact delimiter, so repeating it here would let a
32
+ * header line shadow the real one. parseBundle ignores everything before the
33
+ * first delimiter, so both round-trip paths are unaffected.
34
+ */
35
+ export function buildBundleHeader(pages, options = {}) {
36
+ if (pages.length === 0)
37
+ return "";
38
+ const lines = [
39
+ `===SESSION BUNDLE: ${pages.length} page${pages.length === 1 ? "" : "s"}===`,
40
+ "WORKING SET CONTRACT — the pages listed below are already included in full.",
41
+ "Do NOT call read_page on any of them; read their content from this bundle.",
42
+ "Edit in memory and write back with push_session_bundle at close-out.",
43
+ ];
44
+ if (options.filter) {
45
+ const of = options.totalMatching !== undefined ? ` of ${options.totalMatching} matching` : "";
46
+ lines.push(`Selected by: ${options.filter} — ${pages.length}${of}.`);
47
+ }
48
+ lines.push("Pages included:", ...pages.map((p) => ` ${p.name}`));
49
+ if (options.truncated) {
50
+ lines.push("NOTE: more pages matched this filter than fit. Anything not listed above is", "NOT in this bundle — fetch the next slice via nextCursor, or read_page it.");
51
+ }
52
+ // The prohibition above is scoped to pages that ARE listed. Saying only that
53
+ // invites the opposite failure: a filter can under-match, and then a bundle
54
+ // that looks authoritative silently omits most of the project. That is not
55
+ // hypothetical — pull_session_bundle(tags:["cressida"]) once returned 1 of 6
56
+ // pages because the other five were untagged, and because everything matching
57
+ // did fit, nothing was marked truncated. An agent told "do not read_page"
58
+ // would have been steered away from the very calls that recovered the
59
+ // session. Absence from this list is never evidence a page does not exist.
60
+ if (options.omittedConventional && options.omittedConventional.length > 0) {
61
+ lines.push(`MISSING ENTRY POINT${options.omittedConventional.length === 1 ? "" : "S"}: ${options.omittedConventional.join(", ")}`, "matched this filter but did not fit. These are the pages a project's", "instructions treat as read-first. read_page them directly before treating", "this bundle as the project's current state.");
62
+ }
63
+ lines.push("If a page you expect is not listed, it did not match this filter — it may", "still exist. read_page it directly, or re-pull with a wider filter.");
64
+ lines.push("===END HEADER===", "");
65
+ return lines.join("\n");
66
+ }
67
+ /**
68
+ * Parse a bundle string back into named pages.
69
+ * Throws if the bundle contains no valid page delimiters.
70
+ */
71
+ export function parseBundle(bundle) {
72
+ const lines = bundle.split("\n");
73
+ const pages = [];
74
+ let currentName = null;
75
+ const contentLines = [];
76
+ for (const line of lines) {
77
+ const match = DELIMITER_RE.exec(line);
78
+ if (match) {
79
+ if (currentName !== null) {
80
+ pages.push({ name: currentName, content: contentLines.join("\n").trim() });
81
+ contentLines.length = 0;
82
+ }
83
+ currentName = match[1].trim();
84
+ }
85
+ else if (currentName !== null) {
86
+ contentLines.push(line);
87
+ }
88
+ }
89
+ if (currentName !== null) {
90
+ pages.push({ name: currentName, content: contentLines.join("\n").trim() });
91
+ }
92
+ if (pages.length === 0) {
93
+ throw new Error("No valid page delimiters found in bundle");
94
+ }
95
+ return pages;
96
+ }
97
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/session/bundle.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAA+C;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,YAAY,IAAI,QAAQ,OAAO,EAAE,CAAC;SAC7D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA8B,EAC9B,UAWI,EAAE;IAEN,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG;QACZ,sBAAsB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,sEAAsE;KACvE,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAElE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CACR,6EAA6E,EAC7E,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,0EAA0E;IAC1E,sEAAsE;IACtE,2EAA2E;IAC3E,IAAI,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CACR,sBAAsB,OAAO,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACtH,sEAAsE,EACtE,2EAA2E,EAC3E,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,2EAA2E,EAC3E,qEAAqE,CACtE,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC3E,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,157 @@
1
+ import { DriveBackup } from "../backup/drive.js";
2
+ export interface WikiFile {
3
+ fileId: string;
4
+ name: string;
5
+ content: string;
6
+ revision: string;
7
+ modifiedTime: string;
8
+ }
9
+ export interface WriteResult {
10
+ fileId: string;
11
+ revision: string;
12
+ modifiedTime: string;
13
+ }
14
+ export interface FileEntry {
15
+ fileId: string;
16
+ name: string;
17
+ modifiedTime: string;
18
+ size: number;
19
+ }
20
+ export interface StorageClient {
21
+ listFiles(): Promise<FileEntry[]>;
22
+ readFile(name: string): Promise<WikiFile>;
23
+ createFile(name: string, content: string): Promise<WriteResult>;
24
+ updateFile(fileId: string, content: string, seenRevision: string): Promise<WriteResult>;
25
+ renameFile(fileId: string, newName: string): Promise<WriteResult>;
26
+ deleteFile(name: string): Promise<void>;
27
+ bootstrapWikiFiles(): Promise<void>;
28
+ verifyAccess(): Promise<void>;
29
+ getStorageLocation(): string;
30
+ /**
31
+ * Cheap existence probe. Exists so callers that only need "is this object
32
+ * there" do not download it — the scoped-client wipe check was pulling the
33
+ * whole of index.md (~200 KB on a large wiki) every 5 minutes per user just
34
+ * to answer this question (GH #412).
35
+ */
36
+ fileExists(name: string): Promise<boolean>;
37
+ }
38
+ export declare class LocalClient implements StorageClient {
39
+ private readonly wikiDir;
40
+ private readonly backup;
41
+ constructor(wikiDir: string, backup?: DriveBackup | null);
42
+ getStorageLocation(): string;
43
+ verifyAccess(): Promise<void>;
44
+ fileExists(name: string): Promise<boolean>;
45
+ listFiles(): Promise<FileEntry[]>;
46
+ readFile(name: string): Promise<WikiFile>;
47
+ createFile(name: string, content: string): Promise<WriteResult>;
48
+ updateFile(fileId: string, content: string, seenRevision: string): Promise<WriteResult>;
49
+ renameFile(fileId: string, newName: string): Promise<WriteResult>;
50
+ deleteFile(name: string): Promise<void>;
51
+ bootstrapWikiFiles(): Promise<void>;
52
+ private assertSafePath;
53
+ private scheduleBackup;
54
+ private pruneEmptyParentDirs;
55
+ }
56
+ export declare class SupabaseStorageClient implements StorageClient {
57
+ private readonly supabaseUrl;
58
+ private readonly serviceRoleKey;
59
+ private readonly bucket;
60
+ private readonly prefix;
61
+ private readonly cacheLocation;
62
+ private readonly backup;
63
+ constructor(options: {
64
+ supabaseUrl: string;
65
+ serviceRoleKey: string;
66
+ bucket: string;
67
+ prefix?: string;
68
+ cacheLocation?: string;
69
+ backup?: DriveBackup | null;
70
+ });
71
+ withPrefix(additionalPrefix: string): SupabaseStorageClient;
72
+ getStorageLocation(): string;
73
+ verifyAccess(): Promise<void>;
74
+ listFiles(): Promise<FileEntry[]>;
75
+ /**
76
+ * HEAD the object rather than downloading it.
77
+ *
78
+ * Deliberately conservative: only a 404 is treated as "absent". Any other
79
+ * non-OK status falls back to a full read, because the sole caller uses this
80
+ * to detect an externally wiped wiki, and a false negative would trigger an
81
+ * unnecessary re-bootstrap and index backfill.
82
+ */
83
+ fileExists(name: string): Promise<boolean>;
84
+ readFile(name: string): Promise<WikiFile>;
85
+ createFile(name: string, content: string): Promise<WriteResult>;
86
+ updateFile(fileId: string, content: string, seenRevision: string): Promise<WriteResult>;
87
+ renameFile(fileId: string, newName: string): Promise<WriteResult>;
88
+ deleteFile(name: string): Promise<void>;
89
+ bootstrapWikiFiles(): Promise<void>;
90
+ private authHeaders;
91
+ private objectPath;
92
+ private walkList;
93
+ private listObjects;
94
+ private uploadObject;
95
+ private deleteObject;
96
+ private pruneEmptyParentDirs;
97
+ private isDirectoryItem;
98
+ private parseModifiedTime;
99
+ private cacheKeySegment;
100
+ private sanitizeForCache;
101
+ private scheduleBackup;
102
+ }
103
+ export declare function getLocalClient(): Promise<LocalClient>;
104
+ export declare function getStorageClient(): Promise<StorageClient>;
105
+ export declare function createScopedStorageClient(baseClient: StorageClient, scopePrefix: string): StorageClient;
106
+ export interface ProjectGrantRoute {
107
+ /** Folder-prefix the grant covers, e.g. 'projects/5280' (no trailing slash). */
108
+ prefix: string;
109
+ /** Storage client scoped to the grant owner's own namespace root. */
110
+ client: StorageClient;
111
+ /** Supabase subject of the grant owner — the true owner for index-attribution purposes (BRA-381). */
112
+ ownerSubject: string;
113
+ }
114
+ export declare class GrantAwareStorageClient implements StorageClient {
115
+ private readonly ownClient;
116
+ private readonly grants;
117
+ private readonly ownSubject;
118
+ constructor(ownClient: StorageClient, grants: ProjectGrantRoute[], ownSubject: string);
119
+ private resolve;
120
+ /**
121
+ * The true storage-owner subject for `name` — the grant owner's subject if
122
+ * the path falls under an active grant, otherwise the requester's own
123
+ * subject. Search-index writes must attribute to this, not the raw
124
+ * authenticated actor, or an owner never sees a grantee's contributions
125
+ * via list_pages/search_pages (BRA-381).
126
+ */
127
+ resolveOwnerSubject(name: string): string;
128
+ getStorageLocation(): string;
129
+ verifyAccess(): Promise<void>;
130
+ bootstrapWikiFiles(): Promise<void>;
131
+ fileExists(name: string): Promise<boolean>;
132
+ listFiles(): Promise<FileEntry[]>;
133
+ /**
134
+ * Own-namespace files only, excluding anything merged in from grants.
135
+ * audit_index compares this listing against `listAllPageNames(userId)`,
136
+ * which likewise only returns the actor's own index rows — the merged
137
+ * `listFiles()` would put grant-owner files on the Drive side with no
138
+ * counterpart on the index side, fabricating "unindexed" drift for shared
139
+ * pages the actor never actually owns (BRA-1857 / GH #453).
140
+ */
141
+ listOwnFiles(): Promise<FileEntry[]>;
142
+ readFile(name: string): Promise<WikiFile>;
143
+ createFile(name: string, content: string): Promise<WriteResult>;
144
+ updateFile(fileId: string, content: string, seenRevision: string): Promise<WriteResult>;
145
+ renameFile(fileId: string, newName: string): Promise<WriteResult>;
146
+ deleteFile(name: string): Promise<void>;
147
+ }
148
+ /**
149
+ * Resolves the correct subject to attribute a Postgres search-index write to
150
+ * for `name`: the grant owner's subject when `drive` is grant-aware and
151
+ * `name` falls under an active grant, otherwise `actorUserId` unchanged.
152
+ * Use this — not the raw authenticated actor — for every index call
153
+ * (upsertPage, deletePage, fetchPageRow, syncPageLinks, etc.) so an owner can
154
+ * see a grantee's contributions via list_pages/search_pages (BRA-381).
155
+ */
156
+ export declare function resolveIndexOwnerSubject(drive: StorageClient, name: string, actorUserId: string): string;
157
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/storage/client.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAcjD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,kBAAkB,IAAI,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5C;AAuED,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,WAAW,GAAG,IAAW;IAK9D,kBAAkB,IAAI,MAAM;IAItB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkCjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA8B/D,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC;IA+BjB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BjE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzC,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;YAOR,oBAAoB;CAuBnC;AAED,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;KAC7B;IAWD,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,qBAAqB;IAe3D,kBAAkB,IAAI,MAAM;IAItB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB7B,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMvC;;;;;;;OAOG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwCzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0B/D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBvF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBjE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+EzC,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,UAAU;YAIJ,QAAQ;YAuBR,WAAW;YA0BX,YAAY;YAyBZ,YAAY;YAcZ,oBAAoB;IAoBlC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;CAMvB;AAkBD,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAU3D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB/D;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAUvG;AAQD,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,EAAE,aAAa,CAAC;IACtB,qGAAqG;IACrG,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,qBAAa,uBAAwB,YAAW,aAAa;IAEzD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAFV,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,UAAU,EAAE,MAAM;IAGrC,OAAO,CAAC,OAAO;IAKf;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKzC,kBAAkB,IAAI,MAAM;IAItB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBvC;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI/D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIjF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAWvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAGxG"}