@maadb/core 0.0.1 → 0.7.9

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 (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -3
  3. package/dist/architect.d.ts +2 -0
  4. package/dist/architect.d.ts.map +1 -0
  5. package/dist/architect.js +273 -0
  6. package/dist/architect.js.map +1 -0
  7. package/dist/auth/resolve.d.ts +36 -0
  8. package/dist/auth/resolve.d.ts.map +1 -0
  9. package/dist/auth/resolve.js +77 -0
  10. package/dist/auth/resolve.js.map +1 -0
  11. package/dist/auth/token-store.d.ts +82 -0
  12. package/dist/auth/token-store.d.ts.map +1 -0
  13. package/dist/auth/token-store.js +464 -0
  14. package/dist/auth/token-store.js.map +1 -0
  15. package/dist/auth/types.d.ts +75 -0
  16. package/dist/auth/types.d.ts.map +1 -0
  17. package/dist/auth/types.js +15 -0
  18. package/dist/auth/types.js.map +1 -0
  19. package/dist/backend/adapter.d.ts +57 -0
  20. package/dist/backend/adapter.d.ts.map +1 -0
  21. package/dist/backend/adapter.js +6 -0
  22. package/dist/backend/adapter.js.map +1 -0
  23. package/dist/backend/index.d.ts +3 -0
  24. package/dist/backend/index.d.ts.map +1 -0
  25. package/dist/backend/index.js +2 -0
  26. package/dist/backend/index.js.map +1 -0
  27. package/dist/backend/sqlite/index.d.ts +63 -0
  28. package/dist/backend/sqlite/index.d.ts.map +1 -0
  29. package/dist/backend/sqlite/index.js +521 -0
  30. package/dist/backend/sqlite/index.js.map +1 -0
  31. package/dist/backend/sqlite/schema.d.ts +2 -0
  32. package/dist/backend/sqlite/schema.d.ts.map +1 -0
  33. package/dist/backend/sqlite/schema.js +88 -0
  34. package/dist/backend/sqlite/schema.js.map +1 -0
  35. package/dist/claude-md.d.ts +2 -0
  36. package/dist/claude-md.d.ts.map +1 -0
  37. package/dist/claude-md.js +97 -0
  38. package/dist/claude-md.js.map +1 -0
  39. package/dist/cli/commands/audit.d.ts +4 -0
  40. package/dist/cli/commands/audit.d.ts.map +1 -0
  41. package/dist/cli/commands/audit.js +39 -0
  42. package/dist/cli/commands/audit.js.map +1 -0
  43. package/dist/cli/commands/auth.d.ts +8 -0
  44. package/dist/cli/commands/auth.d.ts.map +1 -0
  45. package/dist/cli/commands/auth.js +242 -0
  46. package/dist/cli/commands/auth.js.map +1 -0
  47. package/dist/cli/commands/discover.d.ts +5 -0
  48. package/dist/cli/commands/discover.d.ts.map +1 -0
  49. package/dist/cli/commands/discover.js +48 -0
  50. package/dist/cli/commands/discover.js.map +1 -0
  51. package/dist/cli/commands/maintain.d.ts +6 -0
  52. package/dist/cli/commands/maintain.d.ts.map +1 -0
  53. package/dist/cli/commands/maintain.js +168 -0
  54. package/dist/cli/commands/maintain.js.map +1 -0
  55. package/dist/cli/commands/read.d.ts +7 -0
  56. package/dist/cli/commands/read.d.ts.map +1 -0
  57. package/dist/cli/commands/read.js +139 -0
  58. package/dist/cli/commands/read.js.map +1 -0
  59. package/dist/cli/commands/write.d.ts +4 -0
  60. package/dist/cli/commands/write.d.ts.map +1 -0
  61. package/dist/cli/commands/write.js +99 -0
  62. package/dist/cli/commands/write.js.map +1 -0
  63. package/dist/cli/helpers.d.ts +8 -0
  64. package/dist/cli/helpers.d.ts.map +1 -0
  65. package/dist/cli/helpers.js +17 -0
  66. package/dist/cli/helpers.js.map +1 -0
  67. package/dist/cli/index.d.ts +3 -0
  68. package/dist/cli/index.d.ts.map +1 -0
  69. package/dist/cli/index.js +296 -0
  70. package/dist/cli/index.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +7 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/engine/audit.d.ts +15 -0
  76. package/dist/engine/audit.d.ts.map +1 -0
  77. package/dist/engine/audit.js +42 -0
  78. package/dist/engine/audit.js.map +1 -0
  79. package/dist/engine/composites.d.ts +6 -0
  80. package/dist/engine/composites.d.ts.map +1 -0
  81. package/dist/engine/composites.js +102 -0
  82. package/dist/engine/composites.js.map +1 -0
  83. package/dist/engine/context.d.ts +47 -0
  84. package/dist/engine/context.d.ts.map +1 -0
  85. package/dist/engine/context.js +55 -0
  86. package/dist/engine/context.js.map +1 -0
  87. package/dist/engine/docid-safe.d.ts +8 -0
  88. package/dist/engine/docid-safe.d.ts.map +1 -0
  89. package/dist/engine/docid-safe.js +0 -0
  90. package/dist/engine/docid-safe.js.map +1 -0
  91. package/dist/engine/helpers.d.ts +8 -0
  92. package/dist/engine/helpers.d.ts.map +1 -0
  93. package/dist/engine/helpers.js +102 -0
  94. package/dist/engine/helpers.js.map +1 -0
  95. package/dist/engine/index.d.ts +209 -0
  96. package/dist/engine/index.d.ts.map +1 -0
  97. package/dist/engine/index.js +489 -0
  98. package/dist/engine/index.js.map +1 -0
  99. package/dist/engine/indexing.d.ts +14 -0
  100. package/dist/engine/indexing.d.ts.map +1 -0
  101. package/dist/engine/indexing.js +225 -0
  102. package/dist/engine/indexing.js.map +1 -0
  103. package/dist/engine/journal.d.ts +32 -0
  104. package/dist/engine/journal.d.ts.map +1 -0
  105. package/dist/engine/journal.js +111 -0
  106. package/dist/engine/journal.js.map +1 -0
  107. package/dist/engine/logger.d.ts +19 -0
  108. package/dist/engine/logger.d.ts.map +1 -0
  109. package/dist/engine/logger.js +40 -0
  110. package/dist/engine/logger.js.map +1 -0
  111. package/dist/engine/maintenance.d.ts +15 -0
  112. package/dist/engine/maintenance.d.ts.map +1 -0
  113. package/dist/engine/maintenance.js +87 -0
  114. package/dist/engine/maintenance.js.map +1 -0
  115. package/dist/engine/mutex.d.ts +24 -0
  116. package/dist/engine/mutex.d.ts.map +1 -0
  117. package/dist/engine/mutex.js +50 -0
  118. package/dist/engine/mutex.js.map +1 -0
  119. package/dist/engine/pathguard.d.ts +16 -0
  120. package/dist/engine/pathguard.d.ts.map +1 -0
  121. package/dist/engine/pathguard.js +41 -0
  122. package/dist/engine/pathguard.js.map +1 -0
  123. package/dist/engine/reads.d.ts +24 -0
  124. package/dist/engine/reads.d.ts.map +1 -0
  125. package/dist/engine/reads.js +701 -0
  126. package/dist/engine/reads.js.map +1 -0
  127. package/dist/engine/types.d.ts +350 -0
  128. package/dist/engine/types.d.ts.map +1 -0
  129. package/dist/engine/types.js +5 -0
  130. package/dist/engine/types.js.map +1 -0
  131. package/dist/engine/writes.d.ts +10 -0
  132. package/dist/engine/writes.d.ts.map +1 -0
  133. package/dist/engine/writes.js +606 -0
  134. package/dist/engine/writes.js.map +1 -0
  135. package/dist/engine.d.ts +3 -0
  136. package/dist/engine.d.ts.map +1 -0
  137. package/dist/engine.js +6 -0
  138. package/dist/engine.js.map +1 -0
  139. package/dist/errors.d.ts +20 -0
  140. package/dist/errors.d.ts.map +1 -0
  141. package/dist/errors.js +17 -0
  142. package/dist/errors.js.map +1 -0
  143. package/dist/extractor/fields.d.ts +3 -0
  144. package/dist/extractor/fields.d.ts.map +1 -0
  145. package/dist/extractor/fields.js +58 -0
  146. package/dist/extractor/fields.js.map +1 -0
  147. package/dist/extractor/index.d.ts +7 -0
  148. package/dist/extractor/index.d.ts.map +1 -0
  149. package/dist/extractor/index.js +22 -0
  150. package/dist/extractor/index.js.map +1 -0
  151. package/dist/extractor/normalizers.d.ts +22 -0
  152. package/dist/extractor/normalizers.d.ts.map +1 -0
  153. package/dist/extractor/normalizers.js +250 -0
  154. package/dist/extractor/normalizers.js.map +1 -0
  155. package/dist/extractor/objects.d.ts +3 -0
  156. package/dist/extractor/objects.d.ts.map +1 -0
  157. package/dist/extractor/objects.js +33 -0
  158. package/dist/extractor/objects.js.map +1 -0
  159. package/dist/extractor/relationships.d.ts +3 -0
  160. package/dist/extractor/relationships.d.ts.map +1 -0
  161. package/dist/extractor/relationships.js +58 -0
  162. package/dist/extractor/relationships.js.map +1 -0
  163. package/dist/git/commit.d.ts +63 -0
  164. package/dist/git/commit.d.ts.map +1 -0
  165. package/dist/git/commit.js +161 -0
  166. package/dist/git/commit.js.map +1 -0
  167. package/dist/git/diff.d.ts +4 -0
  168. package/dist/git/diff.d.ts.map +1 -0
  169. package/dist/git/diff.js +56 -0
  170. package/dist/git/diff.js.map +1 -0
  171. package/dist/git/index.d.ts +41 -0
  172. package/dist/git/index.d.ts.map +1 -0
  173. package/dist/git/index.js +86 -0
  174. package/dist/git/index.js.map +1 -0
  175. package/dist/git/log.d.ts +13 -0
  176. package/dist/git/log.d.ts.map +1 -0
  177. package/dist/git/log.js +116 -0
  178. package/dist/git/log.js.map +1 -0
  179. package/dist/git/snapshot.d.ts +4 -0
  180. package/dist/git/snapshot.d.ts.map +1 -0
  181. package/dist/git/snapshot.js +65 -0
  182. package/dist/git/snapshot.js.map +1 -0
  183. package/dist/instance/config.d.ts +19 -0
  184. package/dist/instance/config.d.ts.map +1 -0
  185. package/dist/instance/config.js +107 -0
  186. package/dist/instance/config.js.map +1 -0
  187. package/dist/instance/pool.d.ts +138 -0
  188. package/dist/instance/pool.d.ts.map +1 -0
  189. package/dist/instance/pool.js +335 -0
  190. package/dist/instance/pool.js.map +1 -0
  191. package/dist/instance/session.d.ts +140 -0
  192. package/dist/instance/session.d.ts.map +1 -0
  193. package/dist/instance/session.js +267 -0
  194. package/dist/instance/session.js.map +1 -0
  195. package/dist/logging.d.ts +108 -0
  196. package/dist/logging.d.ts.map +1 -0
  197. package/dist/logging.js +120 -0
  198. package/dist/logging.js.map +1 -0
  199. package/dist/maad-md.d.ts +11 -0
  200. package/dist/maad-md.d.ts.map +1 -0
  201. package/dist/maad-md.js +252 -0
  202. package/dist/maad-md.js.map +1 -0
  203. package/dist/mcp/bulk-cap.d.ts +10 -0
  204. package/dist/mcp/bulk-cap.d.ts.map +1 -0
  205. package/dist/mcp/bulk-cap.js +37 -0
  206. package/dist/mcp/bulk-cap.js.map +1 -0
  207. package/dist/mcp/config.d.ts +18 -0
  208. package/dist/mcp/config.d.ts.map +1 -0
  209. package/dist/mcp/config.js +20 -0
  210. package/dist/mcp/config.js.map +1 -0
  211. package/dist/mcp/ctx.d.ts +17 -0
  212. package/dist/mcp/ctx.d.ts.map +1 -0
  213. package/dist/mcp/ctx.js +7 -0
  214. package/dist/mcp/ctx.js.map +1 -0
  215. package/dist/mcp/guardrails.d.ts +21 -0
  216. package/dist/mcp/guardrails.d.ts.map +1 -0
  217. package/dist/mcp/guardrails.js +39 -0
  218. package/dist/mcp/guardrails.js.map +1 -0
  219. package/dist/mcp/idempotency.d.ts +69 -0
  220. package/dist/mcp/idempotency.d.ts.map +1 -0
  221. package/dist/mcp/idempotency.js +168 -0
  222. package/dist/mcp/idempotency.js.map +1 -0
  223. package/dist/mcp/instance-reload.d.ts +23 -0
  224. package/dist/mcp/instance-reload.d.ts.map +1 -0
  225. package/dist/mcp/instance-reload.js +126 -0
  226. package/dist/mcp/instance-reload.js.map +1 -0
  227. package/dist/mcp/kinds.d.ts +22 -0
  228. package/dist/mcp/kinds.d.ts.map +1 -0
  229. package/dist/mcp/kinds.js +110 -0
  230. package/dist/mcp/kinds.js.map +1 -0
  231. package/dist/mcp/lifecycle.d.ts +8 -0
  232. package/dist/mcp/lifecycle.d.ts.map +1 -0
  233. package/dist/mcp/lifecycle.js +65 -0
  234. package/dist/mcp/lifecycle.js.map +1 -0
  235. package/dist/mcp/notifications.d.ts +87 -0
  236. package/dist/mcp/notifications.d.ts.map +1 -0
  237. package/dist/mcp/notifications.js +154 -0
  238. package/dist/mcp/notifications.js.map +1 -0
  239. package/dist/mcp/query-depth.d.ts +28 -0
  240. package/dist/mcp/query-depth.d.ts.map +1 -0
  241. package/dist/mcp/query-depth.js +43 -0
  242. package/dist/mcp/query-depth.js.map +1 -0
  243. package/dist/mcp/rate-limit.d.ts +60 -0
  244. package/dist/mcp/rate-limit.d.ts.map +1 -0
  245. package/dist/mcp/rate-limit.js +203 -0
  246. package/dist/mcp/rate-limit.js.map +1 -0
  247. package/dist/mcp/reload-signal.d.ts +13 -0
  248. package/dist/mcp/reload-signal.d.ts.map +1 -0
  249. package/dist/mcp/reload-signal.js +68 -0
  250. package/dist/mcp/reload-signal.js.map +1 -0
  251. package/dist/mcp/response.d.ts +109 -0
  252. package/dist/mcp/response.d.ts.map +1 -0
  253. package/dist/mcp/response.js +132 -0
  254. package/dist/mcp/response.js.map +1 -0
  255. package/dist/mcp/roles.d.ts +7 -0
  256. package/dist/mcp/roles.d.ts.map +1 -0
  257. package/dist/mcp/roles.js +56 -0
  258. package/dist/mcp/roles.js.map +1 -0
  259. package/dist/mcp/server.d.ts +33 -0
  260. package/dist/mcp/server.d.ts.map +1 -0
  261. package/dist/mcp/server.js +242 -0
  262. package/dist/mcp/server.js.map +1 -0
  263. package/dist/mcp/shutdown.d.ts +32 -0
  264. package/dist/mcp/shutdown.d.ts.map +1 -0
  265. package/dist/mcp/shutdown.js +130 -0
  266. package/dist/mcp/shutdown.js.map +1 -0
  267. package/dist/mcp/tools/audit.d.ts +4 -0
  268. package/dist/mcp/tools/audit.d.ts.map +1 -0
  269. package/dist/mcp/tools/audit.js +45 -0
  270. package/dist/mcp/tools/audit.js.map +1 -0
  271. package/dist/mcp/tools/auth.d.ts +4 -0
  272. package/dist/mcp/tools/auth.d.ts.map +1 -0
  273. package/dist/mcp/tools/auth.js +181 -0
  274. package/dist/mcp/tools/auth.js.map +1 -0
  275. package/dist/mcp/tools/discover.d.ts +4 -0
  276. package/dist/mcp/tools/discover.d.ts.map +1 -0
  277. package/dist/mcp/tools/discover.js +83 -0
  278. package/dist/mcp/tools/discover.js.map +1 -0
  279. package/dist/mcp/tools/instance.d.ts +15 -0
  280. package/dist/mcp/tools/instance.d.ts.map +1 -0
  281. package/dist/mcp/tools/instance.js +207 -0
  282. package/dist/mcp/tools/instance.js.map +1 -0
  283. package/dist/mcp/tools/maintain.d.ts +4 -0
  284. package/dist/mcp/tools/maintain.d.ts.map +1 -0
  285. package/dist/mcp/tools/maintain.js +118 -0
  286. package/dist/mcp/tools/maintain.js.map +1 -0
  287. package/dist/mcp/tools/read.d.ts +4 -0
  288. package/dist/mcp/tools/read.d.ts.map +1 -0
  289. package/dist/mcp/tools/read.js +260 -0
  290. package/dist/mcp/tools/read.js.map +1 -0
  291. package/dist/mcp/tools/write.d.ts +4 -0
  292. package/dist/mcp/tools/write.d.ts.map +1 -0
  293. package/dist/mcp/tools/write.js +342 -0
  294. package/dist/mcp/tools/write.js.map +1 -0
  295. package/dist/mcp/transport/auth.d.ts +41 -0
  296. package/dist/mcp/transport/auth.d.ts.map +1 -0
  297. package/dist/mcp/transport/auth.js +115 -0
  298. package/dist/mcp/transport/auth.js.map +1 -0
  299. package/dist/mcp/transport/http.d.ts +62 -0
  300. package/dist/mcp/transport/http.d.ts.map +1 -0
  301. package/dist/mcp/transport/http.js +357 -0
  302. package/dist/mcp/transport/http.js.map +1 -0
  303. package/dist/mcp/transport/pin.d.ts +15 -0
  304. package/dist/mcp/transport/pin.d.ts.map +1 -0
  305. package/dist/mcp/transport/pin.js +71 -0
  306. package/dist/mcp/transport/pin.js.map +1 -0
  307. package/dist/mcp/transport/telemetry.d.ts +79 -0
  308. package/dist/mcp/transport/telemetry.d.ts.map +1 -0
  309. package/dist/mcp/transport/telemetry.js +97 -0
  310. package/dist/mcp/transport/telemetry.js.map +1 -0
  311. package/dist/mcp/with-session.d.ts +26 -0
  312. package/dist/mcp/with-session.d.ts.map +1 -0
  313. package/dist/mcp/with-session.js +275 -0
  314. package/dist/mcp/with-session.js.map +1 -0
  315. package/dist/parser/annotations.d.ts +3 -0
  316. package/dist/parser/annotations.d.ts.map +1 -0
  317. package/dist/parser/annotations.js +41 -0
  318. package/dist/parser/annotations.js.map +1 -0
  319. package/dist/parser/blocks.d.ts +3 -0
  320. package/dist/parser/blocks.d.ts.map +1 -0
  321. package/dist/parser/blocks.js +99 -0
  322. package/dist/parser/blocks.js.map +1 -0
  323. package/dist/parser/frontmatter.d.ts +9 -0
  324. package/dist/parser/frontmatter.d.ts.map +1 -0
  325. package/dist/parser/frontmatter.js +33 -0
  326. package/dist/parser/frontmatter.js.map +1 -0
  327. package/dist/parser/index.d.ts +11 -0
  328. package/dist/parser/index.d.ts.map +1 -0
  329. package/dist/parser/index.js +54 -0
  330. package/dist/parser/index.js.map +1 -0
  331. package/dist/parser/matter.d.ts +3 -0
  332. package/dist/parser/matter.d.ts.map +1 -0
  333. package/dist/parser/matter.js +32 -0
  334. package/dist/parser/matter.js.map +1 -0
  335. package/dist/parser/tags.d.ts +3 -0
  336. package/dist/parser/tags.d.ts.map +1 -0
  337. package/dist/parser/tags.js +32 -0
  338. package/dist/parser/tags.js.map +1 -0
  339. package/dist/parser/verbatim.d.ts +4 -0
  340. package/dist/parser/verbatim.d.ts.map +1 -0
  341. package/dist/parser/verbatim.js +121 -0
  342. package/dist/parser/verbatim.js.map +1 -0
  343. package/dist/parser/yaml-profile.d.ts +4 -0
  344. package/dist/parser/yaml-profile.d.ts.map +1 -0
  345. package/dist/parser/yaml-profile.js +73 -0
  346. package/dist/parser/yaml-profile.js.map +1 -0
  347. package/dist/registry/index.d.ts +2 -0
  348. package/dist/registry/index.d.ts.map +1 -0
  349. package/dist/registry/index.js +2 -0
  350. package/dist/registry/index.js.map +1 -0
  351. package/dist/registry/loader.d.ts +4 -0
  352. package/dist/registry/loader.d.ts.map +1 -0
  353. package/dist/registry/loader.js +147 -0
  354. package/dist/registry/loader.js.map +1 -0
  355. package/dist/registry/types.d.ts +2 -0
  356. package/dist/registry/types.d.ts.map +1 -0
  357. package/dist/registry/types.js +5 -0
  358. package/dist/registry/types.js.map +1 -0
  359. package/dist/scanner.d.ts +57 -0
  360. package/dist/scanner.d.ts.map +1 -0
  361. package/dist/scanner.js +223 -0
  362. package/dist/scanner.js.map +1 -0
  363. package/dist/schema/index.d.ts +3 -0
  364. package/dist/schema/index.d.ts.map +1 -0
  365. package/dist/schema/index.js +3 -0
  366. package/dist/schema/index.js.map +1 -0
  367. package/dist/schema/loader.d.ts +4 -0
  368. package/dist/schema/loader.d.ts.map +1 -0
  369. package/dist/schema/loader.js +303 -0
  370. package/dist/schema/loader.js.map +1 -0
  371. package/dist/schema/precision.d.ts +6 -0
  372. package/dist/schema/precision.d.ts.map +1 -0
  373. package/dist/schema/precision.js +59 -0
  374. package/dist/schema/precision.js.map +1 -0
  375. package/dist/schema/validator.d.ts +21 -0
  376. package/dist/schema/validator.d.ts.map +1 -0
  377. package/dist/schema/validator.js +200 -0
  378. package/dist/schema/validator.js.map +1 -0
  379. package/dist/schema-md.d.ts +8 -0
  380. package/dist/schema-md.d.ts.map +1 -0
  381. package/dist/schema-md.js +98 -0
  382. package/dist/schema-md.js.map +1 -0
  383. package/dist/skill-files.d.ts +3 -0
  384. package/dist/skill-files.d.ts.map +1 -0
  385. package/dist/skill-files.js +362 -0
  386. package/dist/skill-files.js.map +1 -0
  387. package/dist/skills-scaffold.d.ts +10 -0
  388. package/dist/skills-scaffold.d.ts.map +1 -0
  389. package/dist/skills-scaffold.js +52 -0
  390. package/dist/skills-scaffold.js.map +1 -0
  391. package/dist/types.d.ts +309 -0
  392. package/dist/types.d.ts.map +1 -0
  393. package/dist/types.js +111 -0
  394. package/dist/types.js.map +1 -0
  395. package/dist/writer/index.d.ts +7 -0
  396. package/dist/writer/index.d.ts.map +1 -0
  397. package/dist/writer/index.js +32 -0
  398. package/dist/writer/index.js.map +1 -0
  399. package/dist/writer/serializer.d.ts +4 -0
  400. package/dist/writer/serializer.d.ts.map +1 -0
  401. package/dist/writer/serializer.js +103 -0
  402. package/dist/writer/serializer.js.map +1 -0
  403. package/dist/writer/template.d.ts +3 -0
  404. package/dist/writer/template.d.ts.map +1 -0
  405. package/dist/writer/template.js +27 -0
  406. package/dist/writer/template.js.map +1 -0
  407. package/package.json +59 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/mcp/notifications.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAI5C;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAI7D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAEtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAwBD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,0BAA0B,EAAE,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,qBAAqB,CA+C7F"}
@@ -0,0 +1,154 @@
1
+ // ============================================================================
2
+ // Live notifications — 0.6.11 (fup-2026-035)
3
+ //
4
+ // Per-session notifier registry + filtered fan-out for `maad_subscribe`. Each
5
+ // connected MCP session registers one notifier closure that wraps its
6
+ // McpServer's `sendResourceUpdated`. On a durable write (CommitOutcome =
7
+ // 'committed'), the MCP tool handler calls `notifyWrite(ctx, event)`, which
8
+ // walks every session with an active subscription, matches the filter, and
9
+ // fires the notifier.
10
+ //
11
+ // Durability gate: the write-tool handler skips this call when
12
+ // `writeDurable === false` or the underlying commit was a noop. Subscribers
13
+ // never see events for non-durable or no-op writes — the whole point of
14
+ // shipping 0.6.10 durability first.
15
+ //
16
+ // Zero-overhead path: `notifyWrite` early-returns when no session has a
17
+ // subscription. Cheap Map iteration with a single boolean check per session.
18
+ // Sessions without subscriptions pay nothing for the notification path.
19
+ // ============================================================================
20
+ import { logger } from '../engine/logger.js';
21
+ const notifiers = new Map();
22
+ /**
23
+ * Register a notifier for a session. Called by the transport once the
24
+ * per-session McpServer is connected and ready to emit. Overwrites any
25
+ * prior registration for the same sessionId (transport reconnect path).
26
+ */
27
+ export function registerNotifier(sessionId, fn) {
28
+ notifiers.set(sessionId, fn);
29
+ }
30
+ /**
31
+ * Remove a notifier. Called when a session is destroyed (SessionRegistry
32
+ * close handler fans this out). Safe to call with an unknown sessionId.
33
+ */
34
+ export function unregisterNotifier(sessionId) {
35
+ notifiers.delete(sessionId);
36
+ }
37
+ /**
38
+ * Current count of registered notifiers. Used by maad_health telemetry and
39
+ * by zero-overhead fast-path detection in `notifyWrite`.
40
+ */
41
+ export function notifierCount() {
42
+ return notifiers.size;
43
+ }
44
+ /**
45
+ * Test hook — drops every registered notifier. Production code never calls
46
+ * this; vitest suites that reuse the process need it between cases.
47
+ */
48
+ export function __resetNotifiers() {
49
+ notifiers.clear();
50
+ }
51
+ /**
52
+ * Does this session's subscription filter match the event? Null filter
53
+ * fields mean "accept any." In single-mode sessions, if the subscription's
54
+ * `project` is null, it implicitly matches the session's activeProject.
55
+ * In multi-mode, null matches any project in the whitelist.
56
+ */
57
+ function matchesSubscription(state, event) {
58
+ const sub = state.subscription;
59
+ if (!sub)
60
+ return false;
61
+ if (sub.docTypes !== null && !sub.docTypes.includes(event.docType))
62
+ return false;
63
+ if (sub.project !== null) {
64
+ if (sub.project !== event.project)
65
+ return false;
66
+ }
67
+ else {
68
+ // Null project: match the session's visible project scope.
69
+ if (state.mode === 'single' && state.activeProject !== event.project)
70
+ return false;
71
+ if (state.mode === 'multi' && !(state.whitelist ?? []).includes(event.project))
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ /**
77
+ * Fan-out entry point called by MCP write tool handlers after a successful
78
+ * durable commit. Iterates sessions with subscriptions, matches the filter,
79
+ * and invokes each session's notifier. Zero overhead when no session has a
80
+ * subscription (the count check bypasses the iteration).
81
+ *
82
+ * Caller MUST only invoke this when `writeDurable === true` on the engine
83
+ * result — the durability gate is upstream, not here. Delete operations
84
+ * should pass `action: 'delete'` and the docType recorded before deletion.
85
+ */
86
+ export async function notifyWrite(ctx, event) {
87
+ if (notifiers.size === 0)
88
+ return; // fast path: nobody listening
89
+ for (const state of ctx.sessions.snapshot()) {
90
+ if (!matchesSubscription(state, event))
91
+ continue;
92
+ const fn = notifiers.get(state.sessionId);
93
+ if (!fn)
94
+ continue;
95
+ try {
96
+ await fn(event);
97
+ }
98
+ catch (e) {
99
+ // Notifier delivery failure is non-fatal to the write. Log so
100
+ // operators can spot broken transports (disconnected SSE, stale
101
+ // McpServer) — but never propagate the error back to the writer.
102
+ logger.bestEffort('notify', 'deliver', `Notifier failed for session ${state.sessionId}: ${e instanceof Error ? e.message : String(e)}`);
103
+ }
104
+ }
105
+ }
106
+ export function collectSubscriptions(sessions) {
107
+ const subscriptions = [];
108
+ const byProject = {};
109
+ const byDocType = {};
110
+ for (const state of sessions.snapshot()) {
111
+ if (!state.subscription)
112
+ continue;
113
+ subscriptions.push({
114
+ sessionId: state.sessionId,
115
+ mode: state.mode,
116
+ activeProject: state.activeProject ?? null,
117
+ whitelist: state.whitelist ?? null,
118
+ subscription: {
119
+ docTypes: state.subscription.docTypes,
120
+ project: state.subscription.project,
121
+ createdAt: state.subscription.createdAt.toISOString(),
122
+ },
123
+ bindingSource: state.bindingSource,
124
+ lastActivityAt: state.lastActivityAt.toISOString(),
125
+ });
126
+ const explicitProject = state.subscription.project;
127
+ if (explicitProject !== null) {
128
+ byProject[explicitProject] = (byProject[explicitProject] ?? 0) + 1;
129
+ }
130
+ else if (state.mode === 'single' && state.activeProject) {
131
+ byProject[state.activeProject] = (byProject[state.activeProject] ?? 0) + 1;
132
+ }
133
+ else if (state.mode === 'multi' && state.whitelist) {
134
+ for (const p of state.whitelist) {
135
+ byProject[p] = (byProject[p] ?? 0) + 1;
136
+ }
137
+ }
138
+ if (state.subscription.docTypes === null) {
139
+ byDocType['*'] = (byDocType['*'] ?? 0) + 1;
140
+ }
141
+ else {
142
+ for (const t of state.subscription.docTypes) {
143
+ byDocType[t] = (byDocType[t] ?? 0) + 1;
144
+ }
145
+ }
146
+ }
147
+ return {
148
+ totalSubscriptions: subscriptions.length,
149
+ subscriptions,
150
+ byProject,
151
+ byDocType,
152
+ };
153
+ }
154
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/mcp/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { DocId } from '../types.js';
2
+ import type { DocumentMatch } from '../types.js';
3
+ import type { GetResult, GetFullResult } from '../engine/types.js';
4
+ import type { Result } from '../errors.js';
5
+ export type QueryDepth = 'hot' | 'cold' | 'full';
6
+ export interface HydrationEngine {
7
+ getDocument(id: DocId, depth: 'cold'): Promise<Result<GetResult>>;
8
+ getDocumentFull(id: DocId): Promise<Result<GetFullResult>>;
9
+ }
10
+ export interface HydrationOptions {
11
+ depth: QueryDepth;
12
+ depthMaxResults?: number;
13
+ }
14
+ export interface HydratedRow extends DocumentMatch {
15
+ body?: string;
16
+ composite?: GetFullResult;
17
+ _hydrationError?: string;
18
+ }
19
+ export interface HydrationOutcome {
20
+ rows: HydratedRow[];
21
+ meta: {
22
+ depth: QueryDepth;
23
+ hydrated: number;
24
+ capped?: boolean;
25
+ } | null;
26
+ }
27
+ export declare function hydrateQueryRows(engine: HydrationEngine, rows: DocumentMatch[], opts: HydrationOptions): Promise<HydrationOutcome>;
28
+ //# sourceMappingURL=query-depth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-depth.d.ts","sourceRoot":"","sources":["../../src/mcp/query-depth.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CACxE;AAKD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,aAAa,EAAE,EACrB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CA0B3B"}
@@ -0,0 +1,43 @@
1
+ // ============================================================================
2
+ // 0.7.3 (fup-2026-079[a]) — maad_query depth hydration helper.
3
+ //
4
+ // Composite that kills the query-then-N-gets agent pattern. After the engine
5
+ // finds matching pointer rows, the handler optionally hydrates each row with
6
+ // body content (depth=cold) or full composite (depth=full).
7
+ //
8
+ // Sequential per-row to keep memory bounded and to mirror per-doc error
9
+ // surfaces; one failure does not abort the batch — failed rows omit
10
+ // body/composite and stamp `_hydrationError` so callers see the partial.
11
+ //
12
+ // Hard cap on hydration count (default 50, max 100) keeps response payloads
13
+ // from blowing past the response-size guard. Beyond cap, remaining rows
14
+ // return at hot depth.
15
+ // ============================================================================
16
+ const HARD_CAP = 100;
17
+ const DEFAULT_CAP = 50;
18
+ export async function hydrateQueryRows(engine, rows, opts) {
19
+ if (opts.depth === 'hot') {
20
+ return { rows, meta: null };
21
+ }
22
+ const requested = opts.depthMaxResults ?? DEFAULT_CAP;
23
+ const cap = Math.min(Math.max(1, requested), HARD_CAP);
24
+ const toHydrate = Math.min(rows.length, cap);
25
+ const hydrated = await Promise.all(rows.slice(0, toHydrate).map(async (row) => {
26
+ if (opts.depth === 'cold') {
27
+ const r = await engine.getDocument(row.docId, 'cold');
28
+ if (r.ok)
29
+ return { ...row, body: r.value.body ?? '' };
30
+ return { ...row, _hydrationError: r.errors[0]?.code ?? 'UNKNOWN' };
31
+ }
32
+ const r = await engine.getDocumentFull(row.docId);
33
+ if (r.ok)
34
+ return { ...row, composite: r.value };
35
+ return { ...row, _hydrationError: r.errors[0]?.code ?? 'UNKNOWN' };
36
+ }));
37
+ const merged = [...hydrated, ...rows.slice(toHydrate)];
38
+ const meta = { depth: opts.depth, hydrated: toHydrate };
39
+ if (rows.length > cap)
40
+ meta.capped = true;
41
+ return { rows: merged, meta };
42
+ }
43
+ //# sourceMappingURL=query-depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-depth.js","sourceRoot":"","sources":["../../src/mcp/query-depth.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,4DAA4D;AAC5D,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,wEAAwE;AACxE,uBAAuB;AACvB,+EAA+E;AA8B/E,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAuB,EACvB,IAAqB,EACrB,IAAsB;IAEtB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,WAAW,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAkB,MAAM,OAAO,CAAC,GAAG,CAC/C,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAwB,EAAE;QAC/D,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,GAAG,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAChD,OAAO,EAAE,GAAG,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC;IACrE,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,GAAkB,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAA6B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAClF,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,60 @@
1
+ export interface RateLimitConfig {
2
+ writesPerSec: number;
3
+ writesPerMin: number;
4
+ concurrent: number;
5
+ payloadBytes: number;
6
+ disabled: boolean;
7
+ now: () => number;
8
+ }
9
+ export declare function readRateLimitEnv(): Partial<RateLimitConfig>;
10
+ export type RateLimitReason = 'writes_per_sec' | 'writes_per_min' | 'concurrent' | 'payload_too_large';
11
+ export interface RateLimitRejection {
12
+ reason: RateLimitReason;
13
+ limit: number;
14
+ retryAfterMs: number | null;
15
+ }
16
+ export declare function isMutatingTool(toolName: string): boolean;
17
+ export declare class SessionRateLimiter {
18
+ private config;
19
+ private writesSec;
20
+ private writesMin;
21
+ private inFlight;
22
+ constructor(opts?: Partial<RateLimitConfig>);
23
+ /**
24
+ * Per-request payload size gate. Returns null on success or a rejection
25
+ * describing the breach. Runs before anything else — oversize args waste
26
+ * compute.
27
+ */
28
+ checkPayloadSize(bytes: number): RateLimitRejection | null;
29
+ /**
30
+ * Acquire a concurrent-in-flight slot. Returns { release } on success or
31
+ * a rejection. ALL tool calls (reads and writes) use this cap.
32
+ */
33
+ tryAcquireConcurrent(sessionId: string): {
34
+ ok: true;
35
+ release: () => void;
36
+ } | {
37
+ ok: false;
38
+ rejection: RateLimitRejection;
39
+ };
40
+ /**
41
+ * Consume one token each from writes/sec and writes/min. Only called for
42
+ * mutating tools. Returns null on success or a rejection identifying which
43
+ * bucket failed.
44
+ */
45
+ tryAcquireWrite(sessionId: string): RateLimitRejection | null;
46
+ /**
47
+ * Total in-flight requests across all sessions. Used by the H7 graceful
48
+ * shutdown drain loop.
49
+ */
50
+ totalInFlight(): number;
51
+ /** Discard all per-session state for `sessionId`. Called on disconnect. */
52
+ disposeSession(sessionId: string): void;
53
+ /** Test helper — peek at in-flight count for a single session. */
54
+ inFlightFor(sessionId: string): number;
55
+ /** Test helper — peek at current config (for assertions). */
56
+ getConfig(): Readonly<RateLimitConfig>;
57
+ }
58
+ export declare function initRateLimiter(opts: Partial<RateLimitConfig>): void;
59
+ export declare function getRateLimiter(): SessionRateLimiter;
60
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/mcp/rate-limit.ts"],"names":[],"mappings":"AA+CA,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAUD,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,eAAe,CAAC,CAU3D;AAID,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,CAAC;AAEvG,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAeD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAID,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,IAAI,GAAE,OAAO,CAAC,eAAe,CAAM;IAQ/C;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAU1D;;;OAGG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,kBAAkB,CAAA;KAAE;IAqBzH;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAsC7D;;;OAGG;IACH,aAAa,IAAI,MAAM;IAMvB,2EAA2E;IAC3E,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMvC,kEAAkE;IAClE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAItC,6DAA6D;IAC7D,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;CAGvC;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAEpE;AAED,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD"}
@@ -0,0 +1,203 @@
1
+ // ============================================================================
2
+ // SessionRateLimiter — per-session token buckets + payload cap.
3
+ //
4
+ // Three independent buckets per session:
5
+ // writes/sec capacity=10, refill=10 tokens/sec (mutating tools only)
6
+ // writes/min capacity=60, refill=60 tokens/60s (mutating tools only)
7
+ // concurrent semaphore, cap=5 (any tool in flight)
8
+ //
9
+ // Plus one per-request cap:
10
+ // payload_too_large ≥ 1 MiB serialized args
11
+ //
12
+ // Read-only tools are exempt from the write buckets but still count against
13
+ // `concurrent` and `payload`. Refill is lazy (computed on tryAcquire*), no
14
+ // background timers. All knobs env-tunable (MAAD_RL_*). Kill switch:
15
+ // MAAD_RL_DISABLE=1.
16
+ // ============================================================================
17
+ function newBucket(capacity, refillPerSec, nowMs) {
18
+ return { capacity, refillPerSec, tokens: capacity, lastRefillMs: nowMs };
19
+ }
20
+ function refill(bucket, nowMs) {
21
+ const elapsedSec = (nowMs - bucket.lastRefillMs) / 1000;
22
+ if (elapsedSec <= 0)
23
+ return;
24
+ const added = elapsedSec * bucket.refillPerSec;
25
+ bucket.tokens = Math.min(bucket.capacity, bucket.tokens + added);
26
+ bucket.lastRefillMs = nowMs;
27
+ }
28
+ function msUntilOneToken(bucket, nowMs) {
29
+ refill(bucket, nowMs);
30
+ if (bucket.tokens >= 1)
31
+ return 0;
32
+ const deficit = 1 - bucket.tokens;
33
+ return Math.ceil((deficit / bucket.refillPerSec) * 1000);
34
+ }
35
+ const DEFAULTS = {
36
+ writesPerSec: 10,
37
+ writesPerMin: 60,
38
+ concurrent: 5,
39
+ payloadBytes: 1_048_576,
40
+ disabled: false,
41
+ };
42
+ export function readRateLimitEnv() {
43
+ const env = process.env;
44
+ const out = {};
45
+ const num = (s) => (s && !Number.isNaN(Number(s)) ? Number(s) : undefined);
46
+ const wps = num(env.MAAD_RL_WRITES_PER_SEC);
47
+ if (wps !== undefined)
48
+ out.writesPerSec = wps;
49
+ const wpm = num(env.MAAD_RL_WRITES_PER_MIN);
50
+ if (wpm !== undefined)
51
+ out.writesPerMin = wpm;
52
+ const conc = num(env.MAAD_RL_CONCURRENT);
53
+ if (conc !== undefined)
54
+ out.concurrent = conc;
55
+ const pb = num(env.MAAD_RL_PAYLOAD_BYTES);
56
+ if (pb !== undefined)
57
+ out.payloadBytes = pb;
58
+ if (env.MAAD_RL_DISABLE === '1')
59
+ out.disabled = true;
60
+ return out;
61
+ }
62
+ // ---- Mutating tool registry ------------------------------------------------
63
+ const MUTATING_TOOLS = new Set([
64
+ 'maad_create',
65
+ 'maad_update',
66
+ 'maad_bulk_create',
67
+ 'maad_bulk_update',
68
+ // Note: maad_delete is an engine operation, not currently an MCP tool.
69
+ // Indexing ops (reindex, indexAll) are admin tools; they ARE mutating but
70
+ // are gated by role; we count them against the write bucket for consistency.
71
+ 'maad_reindex',
72
+ ]);
73
+ export function isMutatingTool(toolName) {
74
+ return MUTATING_TOOLS.has(toolName);
75
+ }
76
+ // ---- Limiter class ---------------------------------------------------------
77
+ export class SessionRateLimiter {
78
+ config;
79
+ writesSec = new Map();
80
+ writesMin = new Map();
81
+ inFlight = new Map();
82
+ constructor(opts = {}) {
83
+ this.config = {
84
+ ...DEFAULTS,
85
+ now: () => Date.now(),
86
+ ...opts,
87
+ };
88
+ }
89
+ /**
90
+ * Per-request payload size gate. Returns null on success or a rejection
91
+ * describing the breach. Runs before anything else — oversize args waste
92
+ * compute.
93
+ */
94
+ checkPayloadSize(bytes) {
95
+ if (this.config.disabled)
96
+ return null;
97
+ if (bytes <= this.config.payloadBytes)
98
+ return null;
99
+ return {
100
+ reason: 'payload_too_large',
101
+ limit: this.config.payloadBytes,
102
+ retryAfterMs: null,
103
+ };
104
+ }
105
+ /**
106
+ * Acquire a concurrent-in-flight slot. Returns { release } on success or
107
+ * a rejection. ALL tool calls (reads and writes) use this cap.
108
+ */
109
+ tryAcquireConcurrent(sessionId) {
110
+ if (this.config.disabled)
111
+ return { ok: true, release: () => { } };
112
+ const current = this.inFlight.get(sessionId) ?? 0;
113
+ if (current >= this.config.concurrent) {
114
+ return {
115
+ ok: false,
116
+ rejection: { reason: 'concurrent', limit: this.config.concurrent, retryAfterMs: null },
117
+ };
118
+ }
119
+ this.inFlight.set(sessionId, current + 1);
120
+ return {
121
+ ok: true,
122
+ release: () => {
123
+ const c = this.inFlight.get(sessionId) ?? 0;
124
+ if (c <= 1)
125
+ this.inFlight.delete(sessionId);
126
+ else
127
+ this.inFlight.set(sessionId, c - 1);
128
+ },
129
+ };
130
+ }
131
+ /**
132
+ * Consume one token each from writes/sec and writes/min. Only called for
133
+ * mutating tools. Returns null on success or a rejection identifying which
134
+ * bucket failed.
135
+ */
136
+ tryAcquireWrite(sessionId) {
137
+ if (this.config.disabled)
138
+ return null;
139
+ const nowMs = this.config.now();
140
+ let wps = this.writesSec.get(sessionId);
141
+ if (!wps) {
142
+ wps = newBucket(this.config.writesPerSec, this.config.writesPerSec, nowMs);
143
+ this.writesSec.set(sessionId, wps);
144
+ }
145
+ refill(wps, nowMs);
146
+ let wpm = this.writesMin.get(sessionId);
147
+ if (!wpm) {
148
+ wpm = newBucket(this.config.writesPerMin, this.config.writesPerMin / 60, nowMs);
149
+ this.writesMin.set(sessionId, wpm);
150
+ }
151
+ refill(wpm, nowMs);
152
+ if (wps.tokens < 1) {
153
+ return {
154
+ reason: 'writes_per_sec',
155
+ limit: this.config.writesPerSec,
156
+ retryAfterMs: msUntilOneToken(wps, nowMs),
157
+ };
158
+ }
159
+ if (wpm.tokens < 1) {
160
+ return {
161
+ reason: 'writes_per_min',
162
+ limit: this.config.writesPerMin,
163
+ retryAfterMs: msUntilOneToken(wpm, nowMs),
164
+ };
165
+ }
166
+ wps.tokens -= 1;
167
+ wpm.tokens -= 1;
168
+ return null;
169
+ }
170
+ /**
171
+ * Total in-flight requests across all sessions. Used by the H7 graceful
172
+ * shutdown drain loop.
173
+ */
174
+ totalInFlight() {
175
+ let total = 0;
176
+ for (const n of this.inFlight.values())
177
+ total += n;
178
+ return total;
179
+ }
180
+ /** Discard all per-session state for `sessionId`. Called on disconnect. */
181
+ disposeSession(sessionId) {
182
+ this.writesSec.delete(sessionId);
183
+ this.writesMin.delete(sessionId);
184
+ this.inFlight.delete(sessionId);
185
+ }
186
+ /** Test helper — peek at in-flight count for a single session. */
187
+ inFlightFor(sessionId) {
188
+ return this.inFlight.get(sessionId) ?? 0;
189
+ }
190
+ /** Test helper — peek at current config (for assertions). */
191
+ getConfig() {
192
+ return this.config;
193
+ }
194
+ }
195
+ // ---- Module-level singleton -------------------------------------------------
196
+ let limiter = new SessionRateLimiter();
197
+ export function initRateLimiter(opts) {
198
+ limiter = new SessionRateLimiter(opts);
199
+ }
200
+ export function getRateLimiter() {
201
+ return limiter;
202
+ }
203
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/mcp/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { InstanceCtx } from './ctx.js';
2
+ /**
3
+ * Install a SIGHUP listener that triggers performInstanceReload. Safe to call
4
+ * once at startup. Windows returns early (no SIGHUP on that platform). Tests
5
+ * skip this — they invoke performInstanceReload directly.
6
+ */
7
+ export declare function installReloadSignalHandler(ctx: InstanceCtx): void;
8
+ /**
9
+ * Remove the SIGHUP listener. Used by tests between cases and by graceful
10
+ * shutdown to prevent late signals from firing after teardown.
11
+ */
12
+ export declare function uninstallReloadSignalHandler(): void;
13
+ //# sourceMappingURL=reload-signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-signal.d.ts","sourceRoot":"","sources":["../../src/mcp/reload-signal.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA+CjE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAKnD"}
@@ -0,0 +1,68 @@
1
+ // ============================================================================
2
+ // SIGHUP reload signal handler — triggers a full instance reload on POSIX
3
+ // systems (systemctl reload, kill -HUP, etc.). Windows has no SIGHUP concept
4
+ // at the OS level, so installation is a no-op there — operators on Windows
5
+ // use the `maad_instance_reload` MCP tool instead.
6
+ //
7
+ // The handler defers to `performInstanceReload` with source="sighup". Errors
8
+ // are logged to the ops channel but do not crash the process — a failed
9
+ // reload leaves the prior instance state intact.
10
+ // ============================================================================
11
+ import { performInstanceReload } from './instance-reload.js';
12
+ import { getOpsLog } from '../logging.js';
13
+ let signalHandler = null;
14
+ /**
15
+ * Install a SIGHUP listener that triggers performInstanceReload. Safe to call
16
+ * once at startup. Windows returns early (no SIGHUP on that platform). Tests
17
+ * skip this — they invoke performInstanceReload directly.
18
+ */
19
+ export function installReloadSignalHandler(ctx) {
20
+ if (process.platform === 'win32') {
21
+ // No SIGHUP on Windows. Document in the deploy guides that Windows
22
+ // operators must use the maad_instance_reload MCP tool.
23
+ return;
24
+ }
25
+ if (signalHandler) {
26
+ // Already installed — idempotent for test helpers that reinit.
27
+ return;
28
+ }
29
+ signalHandler = () => {
30
+ // Fire-and-forget — the signal handler itself must return synchronously.
31
+ // Errors land on the ops log via performInstanceReload's internal logging.
32
+ void (async () => {
33
+ const instanceResult = await performInstanceReload(ctx, 'sighup');
34
+ if (!instanceResult.ok) {
35
+ const first = instanceResult.errors[0];
36
+ getOpsLog().warn({ event: 'sighup_reload_failed', code: first?.code, message: first?.message }, 'sighup_reload_failed');
37
+ }
38
+ // 0.7.0 — reload tokens.yaml too. Independent of instance reload; a
39
+ // failure here doesn't roll back the instance reload. Captures of
40
+ // ctx.tokens elsewhere (the HTTP transport closure) stay valid because
41
+ // TokenStore.reload mutates the existing instance in-place.
42
+ // Loose null check (`!= null`) catches both null and undefined — test
43
+ // harnesses sometimes pass partial ctx objects without a tokens field.
44
+ if (ctx.tokens != null) {
45
+ const tokensResult = await ctx.tokens.reload();
46
+ if (!tokensResult.ok) {
47
+ const first = tokensResult.errors[0];
48
+ getOpsLog().warn({ event: 'sighup_tokens_reload_failed', code: first?.code, message: first?.message }, 'sighup_tokens_reload_failed');
49
+ }
50
+ else {
51
+ getOpsLog().info({ event: 'tokens_reload', total: tokensResult.value.total, active: tokensResult.value.active }, 'tokens_reload');
52
+ }
53
+ }
54
+ })();
55
+ };
56
+ process.on('SIGHUP', signalHandler);
57
+ }
58
+ /**
59
+ * Remove the SIGHUP listener. Used by tests between cases and by graceful
60
+ * shutdown to prevent late signals from firing after teardown.
61
+ */
62
+ export function uninstallReloadSignalHandler() {
63
+ if (signalHandler && process.platform !== 'win32') {
64
+ process.off('SIGHUP', signalHandler);
65
+ }
66
+ signalHandler = null;
67
+ }
68
+ //# sourceMappingURL=reload-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-signal.js","sourceRoot":"","sources":["../../src/mcp/reload-signal.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E;AAC3E,mDAAmD;AACnD,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,iDAAiD;AACjD,+EAA+E;AAG/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,IAAI,aAAa,GAAkC,IAAI,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAgB;IACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,mEAAmE;QACnE,wDAAwD;QACxD,OAAO;IACT,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,+DAA+D;QAC/D,OAAO;IACT,CAAC;IAED,aAAa,GAAG,GAAG,EAAE;QACnB,yEAAyE;QACzE,2EAA2E;QAC3E,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvC,SAAS,EAAE,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAC7E,sBAAsB,CACvB,CAAC;YACJ,CAAC;YACD,oEAAoE;YACpE,kEAAkE;YAClE,uEAAuE;YACvE,4DAA4D;YAC5D,sEAAsE;YACtE,uEAAuE;YACvE,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;oBACrB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACrC,SAAS,EAAE,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EACpF,6BAA6B,CAC9B,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,SAAS,EAAE,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,EAC9F,eAAe,CAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B;IAC1C,IAAI,aAAa,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACvC,CAAC;IACD,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}