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,379 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ import AdmZip from "adm-zip";
4
+ import { z } from "zod";
5
+ import { appendLogEntry } from "../wiki/log.js";
6
+ import { DriveNotFoundError } from "../drive/errors.js";
7
+ import { parsePage } from "../wiki/frontmatter.js";
8
+ import { getPostgresSearchIndex } from "../search/postgresIndex.js";
9
+ import { READ_CONCURRENCY, mapConcurrent } from "./exportWiki.js";
10
+ export const importWikiZipInputSchema = z.object({
11
+ zipData: z
12
+ .string()
13
+ .optional()
14
+ .describe("Base64-encoded ZIP archive (from export_wiki with no outputPath). Use this instead of zipPath to import without server filesystem access."),
15
+ zipPath: z
16
+ .string()
17
+ .min(1)
18
+ .optional()
19
+ .describe("Absolute or relative path to the ZIP archive to import (created by export_wiki with outputPath). Provide either zipData or zipPath, not both."),
20
+ execute: z
21
+ .boolean()
22
+ .default(false)
23
+ .describe("If false, returns a preview diff only. If true, applies the changes."),
24
+ mode: z
25
+ .enum(["additive", "replace"])
26
+ .default("additive")
27
+ .describe("Import mode. 'additive' (default) imports pages from the ZIP without touching pages absent from the ZIP. 'replace' mirrors the ZIP exactly — imports all ZIP pages AND deletes any existing pages not present in the ZIP. Use 'replace' for a full round-trip restore."),
28
+ conflictStrategy: z
29
+ .enum(["skip", "overwrite", "merge"])
30
+ .default("skip")
31
+ .describe("How to handle files that already exist (ignored when mode=replace, which always overwrites): 'skip' leaves existing files unchanged; 'overwrite' replaces them; 'merge' updates/creates pages present in the zip while leaving all other pages untouched."),
32
+ includeSystem: z
33
+ .boolean()
34
+ .default(false)
35
+ .describe("If true, also imports system files index.md and log.md from the archive"),
36
+ logTiming: z
37
+ .boolean()
38
+ .default(true)
39
+ .describe("If true, appends a log entry to log.md after a successful execute run"),
40
+ });
41
+ // System files subject to the includeSystem flag. Note: export-index.json is handled
42
+ // separately (always skipped with an explicit continue) and is intentionally absent here.
43
+ const SYSTEM_FILES = new Set(["index.md", "log.md"]);
44
+ // Mirrors normalizeWikiPath validation in storage/client.ts. Returns false for any
45
+ // filename that would be rejected by the storage layer (e.g. .txt, uppercase, path traversal).
46
+ export function isValidWikiFilename(name) {
47
+ if (name.startsWith("/"))
48
+ return false;
49
+ const segments = name.split("/");
50
+ if (segments.some((s) => s === "" || s === "." || s === ".."))
51
+ return false;
52
+ for (const seg of segments.slice(0, -1)) {
53
+ if (!/^[a-z0-9-]+$/.test(seg))
54
+ return false;
55
+ }
56
+ const last = segments[segments.length - 1] ?? "";
57
+ return /^[a-z0-9-]+\.md$/.test(last);
58
+ }
59
+ export async function runImportFromBuffer(drive, buffer, opts = {}) {
60
+ const { conflictStrategy = "overwrite", includeSystem = false, deletedNames = [], userId = "", onProgress } = opts;
61
+ const shouldOverwrite = conflictStrategy === "overwrite" || conflictStrategy === "merge";
62
+ const zip = new AdmZip(buffer);
63
+ const entries = zip.getEntries().filter((e) => !e.isDirectory);
64
+ const progressTotal = entries.length + deletedNames.length;
65
+ let progressProcessed = 0;
66
+ // Parse export-index.json to recover the original per-page modifiedTime that was
67
+ // recorded when the ZIP was created. This is better than the storage write time
68
+ // (which equals the import time for bulk uploads), but may still reflect a prior
69
+ // bulk-import if the source brain was itself imported. We fall back to the
70
+ // frontmatter `updated` date when available (see contentModifiedTime below).
71
+ const exportIndexEntry = entries.find((e) => e.entryName.replace(/\\/g, "/") === "export-index.json");
72
+ const originalTimestamps = new Map();
73
+ if (exportIndexEntry) {
74
+ try {
75
+ const idx = JSON.parse(exportIndexEntry.getData().toString("utf8"));
76
+ for (const f of idx.files ?? []) {
77
+ if (f.name && f.modifiedTime)
78
+ originalTimestamps.set(f.name, f.modifiedTime);
79
+ }
80
+ }
81
+ catch {
82
+ // non-fatal — fall through to storage/frontmatter times
83
+ }
84
+ }
85
+ let created = 0;
86
+ let updated = 0;
87
+ let deleted = 0;
88
+ let skipped = 0;
89
+ const errors = [];
90
+ const warnings = [];
91
+ const pgIndex = getPostgresSearchIndex();
92
+ const indexWork = [];
93
+ for (const entry of entries) {
94
+ const name = entry.entryName.replace(/\\/g, "/");
95
+ if (name === "export-index.json")
96
+ continue;
97
+ if (!includeSystem && SYSTEM_FILES.has(name)) {
98
+ skipped++;
99
+ continue;
100
+ }
101
+ if (!isValidWikiFilename(name)) {
102
+ errors.push({ path: name, reason: "Non-wiki file skipped (only lowercase-alphanumeric .md files supported)" });
103
+ onProgress?.(++progressProcessed, progressTotal, "writing");
104
+ continue;
105
+ }
106
+ const incomingContent = entry.getData().toString("utf8");
107
+ const existing = await drive
108
+ .readFile(name)
109
+ .catch((err) => (err instanceof DriveNotFoundError ? null : Promise.reject(err)));
110
+ try {
111
+ // Derive semantic content-edit time: prefer frontmatter `updated` date, then
112
+ // original export-manifest timestamp, then storage write time.
113
+ const parsed = parsePage(incomingContent);
114
+ const fmDate = typeof parsed.frontmatter.updated === "string" ? parsed.frontmatter.updated : null;
115
+ const contentModifiedTime = (fmDate && /^\d{4}-\d{2}-\d{2}/.test(fmDate))
116
+ ? `${fmDate.slice(0, 10)}T00:00:00.000Z`
117
+ : (originalTimestamps.get(name) ?? "");
118
+ if (!existing) {
119
+ const writeResult = await drive.createFile(name, incomingContent);
120
+ indexWork.push({
121
+ kind: "upsert",
122
+ name,
123
+ content: incomingContent,
124
+ revision: writeResult.revision,
125
+ modifiedTime: writeResult.modifiedTime,
126
+ contentModifiedTime: contentModifiedTime || writeResult.modifiedTime,
127
+ });
128
+ created++;
129
+ }
130
+ else if (existing.content === incomingContent) {
131
+ skipped++;
132
+ }
133
+ else if (conflictStrategy === "skip") {
134
+ skipped++;
135
+ }
136
+ else if (conflictStrategy === "error") {
137
+ errors.push({ path: name, reason: "File already exists and conflictStrategy is 'error'" });
138
+ }
139
+ else if (shouldOverwrite) {
140
+ const writeResult = await drive.updateFile(name, incomingContent, "");
141
+ indexWork.push({
142
+ kind: "upsert",
143
+ name,
144
+ content: incomingContent,
145
+ revision: writeResult.revision,
146
+ modifiedTime: writeResult.modifiedTime,
147
+ contentModifiedTime: contentModifiedTime || writeResult.modifiedTime,
148
+ });
149
+ updated++;
150
+ }
151
+ else {
152
+ skipped++;
153
+ }
154
+ }
155
+ catch (err) {
156
+ errors.push({
157
+ path: name,
158
+ reason: err instanceof Error ? err.message : String(err),
159
+ });
160
+ }
161
+ onProgress?.(++progressProcessed, progressTotal, "writing");
162
+ }
163
+ for (const name of deletedNames) {
164
+ if (!includeSystem && SYSTEM_FILES.has(name))
165
+ continue;
166
+ try {
167
+ await drive.deleteFile(name);
168
+ indexWork.push({ kind: "delete", name });
169
+ deleted++;
170
+ }
171
+ catch (err) {
172
+ errors.push({
173
+ path: name,
174
+ reason: err instanceof Error ? err.message : String(err),
175
+ });
176
+ }
177
+ onProgress?.(++progressProcessed, progressTotal, "deleting");
178
+ }
179
+ const indexWarnings = await mapConcurrent(indexWork, READ_CONCURRENCY, async (item) => {
180
+ if (item.kind === "delete") {
181
+ await pgIndex.deletePage(item.name, userId).catch(() => {
182
+ /* non-fatal */
183
+ });
184
+ return null;
185
+ }
186
+ const parsed = parsePage(item.content);
187
+ // Full content (frontmatter included) — matches patchPage.ts's DB-primary
188
+ // convention, which read_page/patch_page read back as the complete file.
189
+ const upsertErr = await pgIndex
190
+ .upsertPage(item.name, parsed.frontmatter, item.content, item.revision, item.modifiedTime, userId, item.contentModifiedTime)
191
+ .then(() => null)
192
+ .catch((err) => ({
193
+ path: item.name,
194
+ reason: err instanceof Error ? err.message : String(err),
195
+ }));
196
+ const syncErr = await pgIndex
197
+ .syncPageLinks(item.name, parsed.content, userId)
198
+ .then(() => null)
199
+ .catch((err) => ({
200
+ path: item.name,
201
+ reason: err instanceof Error ? err.message : String(err),
202
+ }));
203
+ return upsertErr ?? syncErr;
204
+ });
205
+ warnings.push(...indexWarnings.filter((w) => w !== null));
206
+ return { created, updated, deleted, skipped, errors, warnings };
207
+ }
208
+ export async function importWikiZip(drive, input, userId = "") {
209
+ const startMs = Date.now();
210
+ const startedAt = new Date().toISOString();
211
+ if (!input.zipData && !input.zipPath) {
212
+ return { success: false, error: "Provide either zipData (base64) or zipPath." };
213
+ }
214
+ // Resolve the ZIP buffer from either zipData (base64) or zipPath (filesystem).
215
+ const zipBuffer = input.zipData
216
+ ? Buffer.from(input.zipData, "base64")
217
+ : await fs.readFile(path.resolve(input.zipPath));
218
+ const zip = new AdmZip(zipBuffer);
219
+ const entries = zip.getEntries().filter((e) => !e.isDirectory);
220
+ const importMode = input.mode ?? "additive";
221
+ const effectiveConflictStrategy = importMode === "replace" ? "overwrite" : (input.conflictStrategy ?? "skip");
222
+ const diffs = [];
223
+ let newCount = 0;
224
+ let modifiedCount = 0;
225
+ let unchangedCount = 0;
226
+ let skippedCount = 0;
227
+ let deletedCount = 0;
228
+ const zipNames = new Set();
229
+ for (const entry of entries) {
230
+ const name = entry.entryName.replace(/\\/g, "/");
231
+ // Always skip the export-index.json metadata file
232
+ if (name === "export-index.json")
233
+ continue;
234
+ // Reject path traversal
235
+ if (name.startsWith("/") || name.split("/").some((seg) => seg === "..")) {
236
+ diffs.push({ name, status: "skipped" });
237
+ skippedCount++;
238
+ continue;
239
+ }
240
+ // Optionally skip system files
241
+ if (!input.includeSystem && SYSTEM_FILES.has(name)) {
242
+ diffs.push({ name, status: "skipped" });
243
+ skippedCount++;
244
+ continue;
245
+ }
246
+ if (!isValidWikiFilename(name)) {
247
+ diffs.push({ name, status: "skipped" });
248
+ skippedCount++;
249
+ continue;
250
+ }
251
+ zipNames.add(name);
252
+ const incomingContent = entry.getData().toString("utf8");
253
+ // Compare with existing file
254
+ const existing = await drive
255
+ .readFile(name)
256
+ .catch((err) => (err instanceof DriveNotFoundError ? null : Promise.reject(err)));
257
+ if (!existing) {
258
+ diffs.push({ name, status: "new" });
259
+ newCount++;
260
+ }
261
+ else if (existing.content === incomingContent) {
262
+ diffs.push({ name, status: "unchanged" });
263
+ unchangedCount++;
264
+ }
265
+ else {
266
+ if (effectiveConflictStrategy === "skip") {
267
+ diffs.push({ name, status: "skipped" });
268
+ skippedCount++;
269
+ }
270
+ else {
271
+ diffs.push({ name, status: "modified" });
272
+ modifiedCount++;
273
+ }
274
+ }
275
+ }
276
+ // For replace mode, identify existing pages absent from the ZIP (will be deleted).
277
+ const deletedNames = [];
278
+ if (importMode === "replace") {
279
+ const existingFiles = await drive.listFiles();
280
+ for (const existing of existingFiles) {
281
+ const name = existing.name.replace(/\\/g, "/");
282
+ if (!input.includeSystem && SYSTEM_FILES.has(name))
283
+ continue;
284
+ if (!zipNames.has(name)) {
285
+ diffs.push({ name, status: "deleted" });
286
+ deletedNames.push(name);
287
+ deletedCount++;
288
+ }
289
+ }
290
+ }
291
+ const zipLabel = input.zipData ? "(inline zipData)" : input.zipPath;
292
+ if (!input.execute) {
293
+ return {
294
+ success: true,
295
+ mode: "preview",
296
+ importMode,
297
+ zipPath: zipLabel,
298
+ startedAt,
299
+ durationMs: Date.now() - startMs,
300
+ totalEntries: entries.length,
301
+ newCount,
302
+ modifiedCount,
303
+ unchangedCount,
304
+ skippedCount,
305
+ deletedCount,
306
+ diff: diffs,
307
+ };
308
+ }
309
+ // Execute mode: delegate writing to runImportFromBuffer
310
+ const importResult = await runImportFromBuffer(drive, zipBuffer, {
311
+ conflictStrategy: effectiveConflictStrategy,
312
+ includeSystem: input.includeSystem,
313
+ deletedNames,
314
+ userId,
315
+ });
316
+ const durationMs = Date.now() - startMs;
317
+ const completedAt = new Date().toISOString();
318
+ const appliedCount = importResult.created + importResult.updated;
319
+ const failures = importResult.errors.map((e) => ({ name: e.path, error: e.reason }));
320
+ if (input.logTiming) {
321
+ await appendLogEntry(drive, {
322
+ type: "ingest",
323
+ title: "Import wiki zip",
324
+ detail: `zipPath=${zipLabel}, mode=${importMode}, applied=${appliedCount}, deleted=${importResult.deleted}, failed=${failures.length}, ` +
325
+ `durationMs=${durationMs}`,
326
+ }, userId).catch(() => {
327
+ /* non-fatal */
328
+ });
329
+ }
330
+ const appliedOrChanged = appliedCount > 0 || importResult.deleted > 0;
331
+ const discoveredFolders = computeDiscoveredFolders(diffs);
332
+ return {
333
+ success: failures.length === 0,
334
+ mode: "execute",
335
+ importMode,
336
+ zipPath: zipLabel,
337
+ startedAt,
338
+ completedAt,
339
+ durationMs,
340
+ totalEntries: entries.length,
341
+ appliedCount,
342
+ deletedCount: importResult.deleted,
343
+ failedCount: failures.length,
344
+ failures,
345
+ warnings: importResult.warnings.map((w) => ({ name: w.path, warning: w.reason })),
346
+ diff: diffs,
347
+ ...(appliedOrChanged ? {
348
+ instructionRefreshRequired: true,
349
+ discoveredFolders,
350
+ nextAction: buildInstructionRefreshHint(discoveredFolders),
351
+ } : {}),
352
+ };
353
+ }
354
+ /**
355
+ * Derive unique top-level folder prefixes from applied diff entries.
356
+ * Returns sorted paths like ["canonical/", "decisions/", "projects/"].
357
+ */
358
+ export function computeDiscoveredFolders(diffs) {
359
+ const folders = new Set();
360
+ for (const d of diffs) {
361
+ if (d.status === "skipped" || d.status === "unchanged")
362
+ continue;
363
+ const slash = d.name.indexOf("/");
364
+ if (slash > 0) {
365
+ folders.add(d.name.slice(0, slash + 1));
366
+ }
367
+ }
368
+ return [...folders].sort();
369
+ }
370
+ export function buildInstructionRefreshHint(folders) {
371
+ const paths = folders.length > 0
372
+ ? folders.map((f) => `"${f}"`).join(", ")
373
+ : '"projects/", "decisions/"';
374
+ return (`Wiki structure changed after import. Call generate_claude_instructions` +
375
+ ` (and/or generate_gpt_instructions) with inScopePaths: [${paths}]` +
376
+ ` to refresh your AI assistant's instruction block for the new layout,` +
377
+ ` then paste the output into your Claude Project or ChatGPT system prompt.`);
378
+ }
379
+ //# sourceMappingURL=importWikiZip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importWikiZip.js","sourceRoot":"","sources":["../../src/tools/importWikiZip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { type StorageClient } from "../storage/client.js";
3
+ export declare function slugify(name: string): string;
4
+ export declare const initProjectInputSchema: z.ZodObject<{
5
+ projectSlug: z.ZodOptional<z.ZodString>;
6
+ projectName: z.ZodString;
7
+ platform: z.ZodDefault<z.ZodEnum<["claude", "gpt"]>>;
8
+ variant: z.ZodDefault<z.ZodEnum<["minimal", "extended"]>>;
9
+ writeInstructionFile: z.ZodDefault<z.ZodBoolean>;
10
+ seedFoundation: z.ZodDefault<z.ZodBoolean>;
11
+ ensureActiveTrackingPages: z.ZodDefault<z.ZodBoolean>;
12
+ execute: z.ZodDefault<z.ZodBoolean>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ execute: boolean;
15
+ projectName: string;
16
+ variant: "minimal" | "extended";
17
+ platform: "claude" | "gpt";
18
+ writeInstructionFile: boolean;
19
+ seedFoundation: boolean;
20
+ ensureActiveTrackingPages: boolean;
21
+ projectSlug?: string | undefined;
22
+ }, {
23
+ projectName: string;
24
+ execute?: boolean | undefined;
25
+ variant?: "minimal" | "extended" | undefined;
26
+ platform?: "claude" | "gpt" | undefined;
27
+ projectSlug?: string | undefined;
28
+ writeInstructionFile?: boolean | undefined;
29
+ seedFoundation?: boolean | undefined;
30
+ ensureActiveTrackingPages?: boolean | undefined;
31
+ }>;
32
+ export type InitProjectInput = z.infer<typeof initProjectInputSchema>;
33
+ export declare function initProject(drive: StorageClient, input: InitProjectInput, userId?: string): Promise<object>;
34
+ //# sourceMappingURL=initProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initProject.d.ts","sourceRoot":"","sources":["../../src/tools/initProject.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AA8DpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AA+NtE,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,gBAAgB,EACvB,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,CAAC,CA4PjB"}