@maadb/core 0.0.1 → 0.7.10-rc.3

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 (419) 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/backup.d.ts +9 -0
  80. package/dist/engine/backup.d.ts.map +1 -0
  81. package/dist/engine/backup.js +100 -0
  82. package/dist/engine/backup.js.map +1 -0
  83. package/dist/engine/composites.d.ts +6 -0
  84. package/dist/engine/composites.d.ts.map +1 -0
  85. package/dist/engine/composites.js +102 -0
  86. package/dist/engine/composites.js.map +1 -0
  87. package/dist/engine/context.d.ts +47 -0
  88. package/dist/engine/context.d.ts.map +1 -0
  89. package/dist/engine/context.js +55 -0
  90. package/dist/engine/context.js.map +1 -0
  91. package/dist/engine/docid-safe.d.ts +8 -0
  92. package/dist/engine/docid-safe.d.ts.map +1 -0
  93. package/dist/engine/docid-safe.js +0 -0
  94. package/dist/engine/docid-safe.js.map +1 -0
  95. package/dist/engine/helpers.d.ts +8 -0
  96. package/dist/engine/helpers.d.ts.map +1 -0
  97. package/dist/engine/helpers.js +102 -0
  98. package/dist/engine/helpers.js.map +1 -0
  99. package/dist/engine/index.d.ts +215 -0
  100. package/dist/engine/index.d.ts.map +1 -0
  101. package/dist/engine/index.js +494 -0
  102. package/dist/engine/index.js.map +1 -0
  103. package/dist/engine/indexing.d.ts +14 -0
  104. package/dist/engine/indexing.d.ts.map +1 -0
  105. package/dist/engine/indexing.js +225 -0
  106. package/dist/engine/indexing.js.map +1 -0
  107. package/dist/engine/journal.d.ts +32 -0
  108. package/dist/engine/journal.d.ts.map +1 -0
  109. package/dist/engine/journal.js +111 -0
  110. package/dist/engine/journal.js.map +1 -0
  111. package/dist/engine/logger.d.ts +19 -0
  112. package/dist/engine/logger.d.ts.map +1 -0
  113. package/dist/engine/logger.js +40 -0
  114. package/dist/engine/logger.js.map +1 -0
  115. package/dist/engine/maintenance.d.ts +15 -0
  116. package/dist/engine/maintenance.d.ts.map +1 -0
  117. package/dist/engine/maintenance.js +87 -0
  118. package/dist/engine/maintenance.js.map +1 -0
  119. package/dist/engine/mutex.d.ts +24 -0
  120. package/dist/engine/mutex.d.ts.map +1 -0
  121. package/dist/engine/mutex.js +50 -0
  122. package/dist/engine/mutex.js.map +1 -0
  123. package/dist/engine/pathguard.d.ts +16 -0
  124. package/dist/engine/pathguard.d.ts.map +1 -0
  125. package/dist/engine/pathguard.js +41 -0
  126. package/dist/engine/pathguard.js.map +1 -0
  127. package/dist/engine/reads.d.ts +25 -0
  128. package/dist/engine/reads.d.ts.map +1 -0
  129. package/dist/engine/reads.js +904 -0
  130. package/dist/engine/reads.js.map +1 -0
  131. package/dist/engine/types.d.ts +396 -0
  132. package/dist/engine/types.d.ts.map +1 -0
  133. package/dist/engine/types.js +5 -0
  134. package/dist/engine/types.js.map +1 -0
  135. package/dist/engine/writes.d.ts +10 -0
  136. package/dist/engine/writes.d.ts.map +1 -0
  137. package/dist/engine/writes.js +606 -0
  138. package/dist/engine/writes.js.map +1 -0
  139. package/dist/engine.d.ts +3 -0
  140. package/dist/engine.d.ts.map +1 -0
  141. package/dist/engine.js +6 -0
  142. package/dist/engine.js.map +1 -0
  143. package/dist/errors.d.ts +20 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +17 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/extractor/fields.d.ts +3 -0
  148. package/dist/extractor/fields.d.ts.map +1 -0
  149. package/dist/extractor/fields.js +58 -0
  150. package/dist/extractor/fields.js.map +1 -0
  151. package/dist/extractor/index.d.ts +7 -0
  152. package/dist/extractor/index.d.ts.map +1 -0
  153. package/dist/extractor/index.js +22 -0
  154. package/dist/extractor/index.js.map +1 -0
  155. package/dist/extractor/normalizers.d.ts +22 -0
  156. package/dist/extractor/normalizers.d.ts.map +1 -0
  157. package/dist/extractor/normalizers.js +250 -0
  158. package/dist/extractor/normalizers.js.map +1 -0
  159. package/dist/extractor/objects.d.ts +3 -0
  160. package/dist/extractor/objects.d.ts.map +1 -0
  161. package/dist/extractor/objects.js +33 -0
  162. package/dist/extractor/objects.js.map +1 -0
  163. package/dist/extractor/relationships.d.ts +3 -0
  164. package/dist/extractor/relationships.d.ts.map +1 -0
  165. package/dist/extractor/relationships.js +58 -0
  166. package/dist/extractor/relationships.js.map +1 -0
  167. package/dist/git/commit.d.ts +63 -0
  168. package/dist/git/commit.d.ts.map +1 -0
  169. package/dist/git/commit.js +161 -0
  170. package/dist/git/commit.js.map +1 -0
  171. package/dist/git/diff.d.ts +4 -0
  172. package/dist/git/diff.d.ts.map +1 -0
  173. package/dist/git/diff.js +56 -0
  174. package/dist/git/diff.js.map +1 -0
  175. package/dist/git/index.d.ts +63 -0
  176. package/dist/git/index.d.ts.map +1 -0
  177. package/dist/git/index.js +151 -0
  178. package/dist/git/index.js.map +1 -0
  179. package/dist/git/log.d.ts +13 -0
  180. package/dist/git/log.d.ts.map +1 -0
  181. package/dist/git/log.js +116 -0
  182. package/dist/git/log.js.map +1 -0
  183. package/dist/git/snapshot.d.ts +4 -0
  184. package/dist/git/snapshot.d.ts.map +1 -0
  185. package/dist/git/snapshot.js +65 -0
  186. package/dist/git/snapshot.js.map +1 -0
  187. package/dist/instance/config.d.ts +19 -0
  188. package/dist/instance/config.d.ts.map +1 -0
  189. package/dist/instance/config.js +107 -0
  190. package/dist/instance/config.js.map +1 -0
  191. package/dist/instance/pool.d.ts +138 -0
  192. package/dist/instance/pool.d.ts.map +1 -0
  193. package/dist/instance/pool.js +335 -0
  194. package/dist/instance/pool.js.map +1 -0
  195. package/dist/instance/session.d.ts +140 -0
  196. package/dist/instance/session.d.ts.map +1 -0
  197. package/dist/instance/session.js +267 -0
  198. package/dist/instance/session.js.map +1 -0
  199. package/dist/logging.d.ts +108 -0
  200. package/dist/logging.d.ts.map +1 -0
  201. package/dist/logging.js +120 -0
  202. package/dist/logging.js.map +1 -0
  203. package/dist/maad-md.d.ts +11 -0
  204. package/dist/maad-md.d.ts.map +1 -0
  205. package/dist/maad-md.js +252 -0
  206. package/dist/maad-md.js.map +1 -0
  207. package/dist/mcp/bulk-cap.d.ts +10 -0
  208. package/dist/mcp/bulk-cap.d.ts.map +1 -0
  209. package/dist/mcp/bulk-cap.js +37 -0
  210. package/dist/mcp/bulk-cap.js.map +1 -0
  211. package/dist/mcp/config.d.ts +18 -0
  212. package/dist/mcp/config.d.ts.map +1 -0
  213. package/dist/mcp/config.js +20 -0
  214. package/dist/mcp/config.js.map +1 -0
  215. package/dist/mcp/ctx.d.ts +17 -0
  216. package/dist/mcp/ctx.d.ts.map +1 -0
  217. package/dist/mcp/ctx.js +7 -0
  218. package/dist/mcp/ctx.js.map +1 -0
  219. package/dist/mcp/guardrails.d.ts +42 -0
  220. package/dist/mcp/guardrails.d.ts.map +1 -0
  221. package/dist/mcp/guardrails.js +58 -0
  222. package/dist/mcp/guardrails.js.map +1 -0
  223. package/dist/mcp/idempotency.d.ts +69 -0
  224. package/dist/mcp/idempotency.d.ts.map +1 -0
  225. package/dist/mcp/idempotency.js +168 -0
  226. package/dist/mcp/idempotency.js.map +1 -0
  227. package/dist/mcp/instance-reload.d.ts +23 -0
  228. package/dist/mcp/instance-reload.d.ts.map +1 -0
  229. package/dist/mcp/instance-reload.js +126 -0
  230. package/dist/mcp/instance-reload.js.map +1 -0
  231. package/dist/mcp/kinds.d.ts +22 -0
  232. package/dist/mcp/kinds.d.ts.map +1 -0
  233. package/dist/mcp/kinds.js +112 -0
  234. package/dist/mcp/kinds.js.map +1 -0
  235. package/dist/mcp/lifecycle.d.ts +8 -0
  236. package/dist/mcp/lifecycle.d.ts.map +1 -0
  237. package/dist/mcp/lifecycle.js +65 -0
  238. package/dist/mcp/lifecycle.js.map +1 -0
  239. package/dist/mcp/memory-pressure.d.ts +37 -0
  240. package/dist/mcp/memory-pressure.d.ts.map +1 -0
  241. package/dist/mcp/memory-pressure.js +179 -0
  242. package/dist/mcp/memory-pressure.js.map +1 -0
  243. package/dist/mcp/notifications.d.ts +87 -0
  244. package/dist/mcp/notifications.d.ts.map +1 -0
  245. package/dist/mcp/notifications.js +154 -0
  246. package/dist/mcp/notifications.js.map +1 -0
  247. package/dist/mcp/query-depth.d.ts +28 -0
  248. package/dist/mcp/query-depth.d.ts.map +1 -0
  249. package/dist/mcp/query-depth.js +43 -0
  250. package/dist/mcp/query-depth.js.map +1 -0
  251. package/dist/mcp/rate-limit.d.ts +60 -0
  252. package/dist/mcp/rate-limit.d.ts.map +1 -0
  253. package/dist/mcp/rate-limit.js +203 -0
  254. package/dist/mcp/rate-limit.js.map +1 -0
  255. package/dist/mcp/reload-signal.d.ts +13 -0
  256. package/dist/mcp/reload-signal.d.ts.map +1 -0
  257. package/dist/mcp/reload-signal.js +68 -0
  258. package/dist/mcp/reload-signal.js.map +1 -0
  259. package/dist/mcp/response.d.ts +109 -0
  260. package/dist/mcp/response.d.ts.map +1 -0
  261. package/dist/mcp/response.js +132 -0
  262. package/dist/mcp/response.js.map +1 -0
  263. package/dist/mcp/roles.d.ts +7 -0
  264. package/dist/mcp/roles.d.ts.map +1 -0
  265. package/dist/mcp/roles.js +57 -0
  266. package/dist/mcp/roles.js.map +1 -0
  267. package/dist/mcp/server.d.ts +33 -0
  268. package/dist/mcp/server.d.ts.map +1 -0
  269. package/dist/mcp/server.js +252 -0
  270. package/dist/mcp/server.js.map +1 -0
  271. package/dist/mcp/shutdown.d.ts +32 -0
  272. package/dist/mcp/shutdown.d.ts.map +1 -0
  273. package/dist/mcp/shutdown.js +130 -0
  274. package/dist/mcp/shutdown.js.map +1 -0
  275. package/dist/mcp/tools/audit.d.ts +4 -0
  276. package/dist/mcp/tools/audit.d.ts.map +1 -0
  277. package/dist/mcp/tools/audit.js +45 -0
  278. package/dist/mcp/tools/audit.js.map +1 -0
  279. package/dist/mcp/tools/auth.d.ts +4 -0
  280. package/dist/mcp/tools/auth.d.ts.map +1 -0
  281. package/dist/mcp/tools/auth.js +181 -0
  282. package/dist/mcp/tools/auth.js.map +1 -0
  283. package/dist/mcp/tools/backup.d.ts +4 -0
  284. package/dist/mcp/tools/backup.d.ts.map +1 -0
  285. package/dist/mcp/tools/backup.js +52 -0
  286. package/dist/mcp/tools/backup.js.map +1 -0
  287. package/dist/mcp/tools/discover.d.ts +4 -0
  288. package/dist/mcp/tools/discover.d.ts.map +1 -0
  289. package/dist/mcp/tools/discover.js +83 -0
  290. package/dist/mcp/tools/discover.js.map +1 -0
  291. package/dist/mcp/tools/instance.d.ts +15 -0
  292. package/dist/mcp/tools/instance.d.ts.map +1 -0
  293. package/dist/mcp/tools/instance.js +207 -0
  294. package/dist/mcp/tools/instance.js.map +1 -0
  295. package/dist/mcp/tools/maintain.d.ts +4 -0
  296. package/dist/mcp/tools/maintain.d.ts.map +1 -0
  297. package/dist/mcp/tools/maintain.js +123 -0
  298. package/dist/mcp/tools/maintain.js.map +1 -0
  299. package/dist/mcp/tools/read.d.ts +4 -0
  300. package/dist/mcp/tools/read.d.ts.map +1 -0
  301. package/dist/mcp/tools/read.js +304 -0
  302. package/dist/mcp/tools/read.js.map +1 -0
  303. package/dist/mcp/tools/write.d.ts +4 -0
  304. package/dist/mcp/tools/write.d.ts.map +1 -0
  305. package/dist/mcp/tools/write.js +342 -0
  306. package/dist/mcp/tools/write.js.map +1 -0
  307. package/dist/mcp/transport/auth.d.ts +41 -0
  308. package/dist/mcp/transport/auth.d.ts.map +1 -0
  309. package/dist/mcp/transport/auth.js +115 -0
  310. package/dist/mcp/transport/auth.js.map +1 -0
  311. package/dist/mcp/transport/http.d.ts +62 -0
  312. package/dist/mcp/transport/http.d.ts.map +1 -0
  313. package/dist/mcp/transport/http.js +357 -0
  314. package/dist/mcp/transport/http.js.map +1 -0
  315. package/dist/mcp/transport/pin.d.ts +15 -0
  316. package/dist/mcp/transport/pin.d.ts.map +1 -0
  317. package/dist/mcp/transport/pin.js +71 -0
  318. package/dist/mcp/transport/pin.js.map +1 -0
  319. package/dist/mcp/transport/telemetry.d.ts +79 -0
  320. package/dist/mcp/transport/telemetry.d.ts.map +1 -0
  321. package/dist/mcp/transport/telemetry.js +97 -0
  322. package/dist/mcp/transport/telemetry.js.map +1 -0
  323. package/dist/mcp/with-session.d.ts +26 -0
  324. package/dist/mcp/with-session.d.ts.map +1 -0
  325. package/dist/mcp/with-session.js +275 -0
  326. package/dist/mcp/with-session.js.map +1 -0
  327. package/dist/parser/annotations.d.ts +3 -0
  328. package/dist/parser/annotations.d.ts.map +1 -0
  329. package/dist/parser/annotations.js +41 -0
  330. package/dist/parser/annotations.js.map +1 -0
  331. package/dist/parser/blocks.d.ts +3 -0
  332. package/dist/parser/blocks.d.ts.map +1 -0
  333. package/dist/parser/blocks.js +101 -0
  334. package/dist/parser/blocks.js.map +1 -0
  335. package/dist/parser/frontmatter.d.ts +9 -0
  336. package/dist/parser/frontmatter.d.ts.map +1 -0
  337. package/dist/parser/frontmatter.js +33 -0
  338. package/dist/parser/frontmatter.js.map +1 -0
  339. package/dist/parser/index.d.ts +11 -0
  340. package/dist/parser/index.d.ts.map +1 -0
  341. package/dist/parser/index.js +54 -0
  342. package/dist/parser/index.js.map +1 -0
  343. package/dist/parser/matter.d.ts +3 -0
  344. package/dist/parser/matter.d.ts.map +1 -0
  345. package/dist/parser/matter.js +32 -0
  346. package/dist/parser/matter.js.map +1 -0
  347. package/dist/parser/tags.d.ts +3 -0
  348. package/dist/parser/tags.d.ts.map +1 -0
  349. package/dist/parser/tags.js +32 -0
  350. package/dist/parser/tags.js.map +1 -0
  351. package/dist/parser/verbatim.d.ts +4 -0
  352. package/dist/parser/verbatim.d.ts.map +1 -0
  353. package/dist/parser/verbatim.js +121 -0
  354. package/dist/parser/verbatim.js.map +1 -0
  355. package/dist/parser/yaml-profile.d.ts +4 -0
  356. package/dist/parser/yaml-profile.d.ts.map +1 -0
  357. package/dist/parser/yaml-profile.js +73 -0
  358. package/dist/parser/yaml-profile.js.map +1 -0
  359. package/dist/registry/index.d.ts +2 -0
  360. package/dist/registry/index.d.ts.map +1 -0
  361. package/dist/registry/index.js +2 -0
  362. package/dist/registry/index.js.map +1 -0
  363. package/dist/registry/loader.d.ts +4 -0
  364. package/dist/registry/loader.d.ts.map +1 -0
  365. package/dist/registry/loader.js +147 -0
  366. package/dist/registry/loader.js.map +1 -0
  367. package/dist/registry/types.d.ts +2 -0
  368. package/dist/registry/types.d.ts.map +1 -0
  369. package/dist/registry/types.js +5 -0
  370. package/dist/registry/types.js.map +1 -0
  371. package/dist/scanner.d.ts +57 -0
  372. package/dist/scanner.d.ts.map +1 -0
  373. package/dist/scanner.js +223 -0
  374. package/dist/scanner.js.map +1 -0
  375. package/dist/schema/index.d.ts +3 -0
  376. package/dist/schema/index.d.ts.map +1 -0
  377. package/dist/schema/index.js +3 -0
  378. package/dist/schema/index.js.map +1 -0
  379. package/dist/schema/loader.d.ts +4 -0
  380. package/dist/schema/loader.d.ts.map +1 -0
  381. package/dist/schema/loader.js +303 -0
  382. package/dist/schema/loader.js.map +1 -0
  383. package/dist/schema/precision.d.ts +6 -0
  384. package/dist/schema/precision.d.ts.map +1 -0
  385. package/dist/schema/precision.js +59 -0
  386. package/dist/schema/precision.js.map +1 -0
  387. package/dist/schema/validator.d.ts +21 -0
  388. package/dist/schema/validator.d.ts.map +1 -0
  389. package/dist/schema/validator.js +200 -0
  390. package/dist/schema/validator.js.map +1 -0
  391. package/dist/schema-md.d.ts +8 -0
  392. package/dist/schema-md.d.ts.map +1 -0
  393. package/dist/schema-md.js +98 -0
  394. package/dist/schema-md.js.map +1 -0
  395. package/dist/skill-files.d.ts +3 -0
  396. package/dist/skill-files.d.ts.map +1 -0
  397. package/dist/skill-files.js +362 -0
  398. package/dist/skill-files.js.map +1 -0
  399. package/dist/skills-scaffold.d.ts +10 -0
  400. package/dist/skills-scaffold.d.ts.map +1 -0
  401. package/dist/skills-scaffold.js +52 -0
  402. package/dist/skills-scaffold.js.map +1 -0
  403. package/dist/types.d.ts +309 -0
  404. package/dist/types.d.ts.map +1 -0
  405. package/dist/types.js +111 -0
  406. package/dist/types.js.map +1 -0
  407. package/dist/writer/index.d.ts +7 -0
  408. package/dist/writer/index.d.ts.map +1 -0
  409. package/dist/writer/index.js +32 -0
  410. package/dist/writer/index.js.map +1 -0
  411. package/dist/writer/serializer.d.ts +4 -0
  412. package/dist/writer/serializer.d.ts.map +1 -0
  413. package/dist/writer/serializer.js +103 -0
  414. package/dist/writer/serializer.js.map +1 -0
  415. package/dist/writer/template.d.ts +3 -0
  416. package/dist/writer/template.d.ts.map +1 -0
  417. package/dist/writer/template.js +27 -0
  418. package/dist/writer/template.js.map +1 -0
  419. package/package.json +59 -7
@@ -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"}
@@ -0,0 +1,109 @@
1
+ import type { Result, MaadError } from '../errors.js';
2
+ import type { ValidationWarning } from '../types.js';
3
+ import type { ProvenanceMode } from './config.js';
4
+ export declare function setProvenanceMode(mode: ProvenanceMode): void;
5
+ export declare function getProvenanceMode(): ProvenanceMode;
6
+ export declare function successResponse(data: unknown, toolName?: string): {
7
+ content: Array<{
8
+ type: 'text';
9
+ text: string;
10
+ }>;
11
+ };
12
+ export declare function errorResponse(errors: MaadError[]): {
13
+ content: Array<{
14
+ type: 'text';
15
+ text: string;
16
+ }>;
17
+ };
18
+ export declare function resultToResponse<T>(result: Result<T>, toolName?: string): {
19
+ content: Array<{
20
+ type: 'text';
21
+ text: string;
22
+ }>;
23
+ };
24
+ /**
25
+ * 0.7.1 (R3) — Projected-size guard for list-returning tools. Computes the
26
+ * byte size of the serialized response before returning; rejects with
27
+ * RESPONSE_TOO_LARGE when over cap. Prevents silent truncation when the MCP
28
+ * client's tool-output harness caps the response (~80KB in Claude Code).
29
+ *
30
+ * Cap is read lazily from MAAD_RESPONSE_MAX_BYTES each call so tests can
31
+ * flip it via env without re-importing the module. Default 64KB gives
32
+ * headroom below the observed Claude Code ceiling.
33
+ *
34
+ * Only applies to success responses — error responses are small and
35
+ * stamping them risks hiding the original error. Returns the input
36
+ * unchanged for errors or when under cap.
37
+ */
38
+ export declare function responseMaxBytes(): number;
39
+ export declare function guardResponseSize(response: {
40
+ content: Array<{
41
+ type: 'text';
42
+ text: string;
43
+ }>;
44
+ }, context: {
45
+ tool: string;
46
+ hint?: string;
47
+ }): {
48
+ content: Array<{
49
+ type: 'text';
50
+ text: string;
51
+ }>;
52
+ };
53
+ /**
54
+ * Attach or merge fields into `_meta` on an already-serialized tool response.
55
+ * Used by the MCP wrapper to stamp request_id onto every response so clients
56
+ * can quote it in bug reports. Non-breaking (MCP allows extra fields).
57
+ */
58
+ export declare function attachMeta(response: {
59
+ content: Array<{
60
+ type: 'text';
61
+ text: string;
62
+ }>;
63
+ }, meta: Record<string, unknown>): {
64
+ content: Array<{
65
+ type: 'text';
66
+ text: string;
67
+ }>;
68
+ };
69
+ /**
70
+ * Attach validation warnings to `_meta.warnings[]`. No-op when the input is
71
+ * empty or undefined — avoids polluting responses for writes that produced
72
+ * no warnings. Used by write-tool handlers (maad_create / maad_update /
73
+ * maad_bulk_*) after a successful engine call.
74
+ */
75
+ export declare function attachWarnings(response: {
76
+ content: Array<{
77
+ type: 'text';
78
+ text: string;
79
+ }>;
80
+ }, warnings: ValidationWarning[] | undefined): {
81
+ content: Array<{
82
+ type: 'text';
83
+ text: string;
84
+ }>;
85
+ };
86
+ /**
87
+ * 0.6.10 — Stamp commit-durability signals onto a write response. Always
88
+ * attaches `write_durable`. When the commit failed (write landed on disk
89
+ * but the git commit didn't), also attaches `commit_failure` with the
90
+ * action / code / message so the client can log forensics or retry.
91
+ * `write_durable: true` attaches nothing else — existing clients that
92
+ * ignore `_meta` see zero behavioral change.
93
+ */
94
+ export declare function attachDurability(response: {
95
+ content: Array<{
96
+ type: 'text';
97
+ text: string;
98
+ }>;
99
+ }, writeDurable: boolean, commitFailure: {
100
+ code: string;
101
+ message: string;
102
+ action: 'create' | 'update' | 'delete';
103
+ } | undefined): {
104
+ content: Array<{
105
+ type: 'text';
106
+ text: string;
107
+ }>;
108
+ };
109
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/mcp/response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ // ============================================================================
2
+ // MCP Response Contract — standard { ok, data|errors } shape for all tools
3
+ // Provenance mode injects _source metadata when enabled.
4
+ // ============================================================================
5
+ let provenanceMode = 'off';
6
+ export function setProvenanceMode(mode) {
7
+ provenanceMode = mode;
8
+ }
9
+ export function getProvenanceMode() {
10
+ return provenanceMode;
11
+ }
12
+ export function successResponse(data, toolName) {
13
+ const response = { ok: true, data };
14
+ if (provenanceMode !== 'off' && toolName) {
15
+ response._source = toolName;
16
+ }
17
+ return { content: [{ type: 'text', text: JSON.stringify(response) }] };
18
+ }
19
+ export function errorResponse(errors) {
20
+ const response = {
21
+ ok: false,
22
+ errors: errors.map(e => {
23
+ const base = {
24
+ code: e.code,
25
+ message: e.message,
26
+ };
27
+ if (e.details !== undefined)
28
+ base.details = e.details;
29
+ return base;
30
+ }),
31
+ };
32
+ return { content: [{ type: 'text', text: JSON.stringify(response) }] };
33
+ }
34
+ export function resultToResponse(result, toolName) {
35
+ if (result.ok)
36
+ return successResponse(result.value, toolName);
37
+ return errorResponse(result.errors);
38
+ }
39
+ /**
40
+ * 0.7.1 (R3) — Projected-size guard for list-returning tools. Computes the
41
+ * byte size of the serialized response before returning; rejects with
42
+ * RESPONSE_TOO_LARGE when over cap. Prevents silent truncation when the MCP
43
+ * client's tool-output harness caps the response (~80KB in Claude Code).
44
+ *
45
+ * Cap is read lazily from MAAD_RESPONSE_MAX_BYTES each call so tests can
46
+ * flip it via env without re-importing the module. Default 64KB gives
47
+ * headroom below the observed Claude Code ceiling.
48
+ *
49
+ * Only applies to success responses — error responses are small and
50
+ * stamping them risks hiding the original error. Returns the input
51
+ * unchanged for errors or when under cap.
52
+ */
53
+ export function responseMaxBytes() {
54
+ const raw = process.env['MAAD_RESPONSE_MAX_BYTES'];
55
+ if (!raw)
56
+ return 65536;
57
+ const n = Number.parseInt(raw, 10);
58
+ return Number.isFinite(n) && n > 0 ? n : 65536;
59
+ }
60
+ export function guardResponseSize(response, context) {
61
+ const first = response.content[0];
62
+ if (!first || first.type !== 'text')
63
+ return response;
64
+ const cap = responseMaxBytes();
65
+ const bytes = Buffer.byteLength(first.text, 'utf8');
66
+ if (bytes <= cap)
67
+ return response;
68
+ // Only reject success responses — error responses are small and should pass through.
69
+ let parsed;
70
+ try {
71
+ parsed = JSON.parse(first.text);
72
+ }
73
+ catch {
74
+ return response;
75
+ }
76
+ if (parsed.ok === false)
77
+ return response;
78
+ const hint = context.hint ?? 'Narrow field projection, add filters, or paginate with cursor';
79
+ return errorResponse([{
80
+ code: 'RESPONSE_TOO_LARGE',
81
+ message: `Projected response (${bytes} bytes) exceeds cap (${cap} bytes)`,
82
+ details: { projectedBytes: bytes, capBytes: cap, hint, tool: context.tool },
83
+ }]);
84
+ }
85
+ /**
86
+ * Attach or merge fields into `_meta` on an already-serialized tool response.
87
+ * Used by the MCP wrapper to stamp request_id onto every response so clients
88
+ * can quote it in bug reports. Non-breaking (MCP allows extra fields).
89
+ */
90
+ export function attachMeta(response, meta) {
91
+ const first = response.content[0];
92
+ if (!first || first.type !== 'text')
93
+ return response;
94
+ let parsed;
95
+ try {
96
+ parsed = JSON.parse(first.text);
97
+ }
98
+ catch {
99
+ return response;
100
+ }
101
+ const existing = parsed._meta ?? {};
102
+ parsed._meta = { ...existing, ...meta };
103
+ return { content: [{ type: 'text', text: JSON.stringify(parsed) }] };
104
+ }
105
+ /**
106
+ * Attach validation warnings to `_meta.warnings[]`. No-op when the input is
107
+ * empty or undefined — avoids polluting responses for writes that produced
108
+ * no warnings. Used by write-tool handlers (maad_create / maad_update /
109
+ * maad_bulk_*) after a successful engine call.
110
+ */
111
+ export function attachWarnings(response, warnings) {
112
+ if (!warnings || warnings.length === 0)
113
+ return response;
114
+ return attachMeta(response, { warnings });
115
+ }
116
+ /**
117
+ * 0.6.10 — Stamp commit-durability signals onto a write response. Always
118
+ * attaches `write_durable`. When the commit failed (write landed on disk
119
+ * but the git commit didn't), also attaches `commit_failure` with the
120
+ * action / code / message so the client can log forensics or retry.
121
+ * `write_durable: true` attaches nothing else — existing clients that
122
+ * ignore `_meta` see zero behavioral change.
123
+ */
124
+ export function attachDurability(response, writeDurable, commitFailure) {
125
+ if (writeDurable)
126
+ return attachMeta(response, { write_durable: true });
127
+ const meta = { write_durable: false };
128
+ if (commitFailure)
129
+ meta['commit_failure'] = commitFailure;
130
+ return attachMeta(response, meta);
131
+ }
132
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/mcp/response.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,yDAAyD;AACzD,+EAA+E;AAM/E,IAAI,cAAc,GAAmB,KAAK,CAAC;AAE3C,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAiBD,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,QAAiB;IAC9D,MAAM,QAAQ,GAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,cAAc,KAAK,KAAK,IAAI,QAAQ,EAAE,CAAC;QACzC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAmB;IAC/C,MAAM,QAAQ,GAAgB;QAC5B,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACrB,MAAM,IAAI,GAAyE;gBACjF,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC;YACF,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAI,MAAiB,EAAE,QAAiB;IACtE,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9D,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA4D,EAC5D,OAAwC;IAExC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAErD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IAElC,qFAAqF;IACrF,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,+DAA+D,CAAC;IAC7F,OAAO,aAAa,CAAC,CAAC;YACpB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,uBAAuB,KAAK,wBAAwB,GAAG,SAAS;YACzE,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;SAC5E,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,QAA4D,EAC5D,IAA6B;IAE7B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAErD,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAI,MAAM,CAAC,KAA6C,IAAI,EAAE,CAAC;IAC7E,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,QAA4D,EAC5D,QAAyC;IAEzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxD,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA4D,EAC5D,YAAqB,EACrB,aAAoG;IAEpG,IAAI,YAAY;QAAE,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,GAA4B,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC/D,IAAI,aAAa;QAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC;IAC1D,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type Role = 'reader' | 'writer' | 'admin';
2
+ export declare function getToolsForRole(role: Role): ReadonlySet<string>;
3
+ export declare function parseRole(raw: string | undefined): Role;
4
+ export declare function roleSatisfies(have: Role, need: Role): boolean;
5
+ export declare function minRole(a: Role, b: Role): Role;
6
+ export declare function getMinRoleForTool(toolName: string): Role | null;
7
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/mcp/roles.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AA+BjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAE/D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGvD;AAKD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAE7D;AAGD,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE9C;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAK/D"}
@@ -0,0 +1,57 @@
1
+ // ============================================================================
2
+ // MCP Roles — role definitions and tool filtering
3
+ // ============================================================================
4
+ const READER_TOOLS = [
5
+ 'maad_scan', 'maad_summary', 'maad_describe',
6
+ 'maad_get', 'maad_query', 'maad_search', 'maad_related', 'maad_schema', 'maad_aggregate', 'maad_join',
7
+ 'maad_verify', 'maad_find_orphans', 'maad_changes_since',
8
+ 'maad_history', 'maad_audit',
9
+ 'maad_subscribe', 'maad_unsubscribe',
10
+ ];
11
+ const WRITER_TOOLS = [
12
+ ...READER_TOOLS,
13
+ 'maad_create', 'maad_update', 'maad_validate', 'maad_bulk_create', 'maad_bulk_update',
14
+ ];
15
+ const ADMIN_TOOLS = [
16
+ ...WRITER_TOOLS,
17
+ 'maad_delete', 'maad_reindex', 'maad_reload', 'maad_health',
18
+ 'maad_instance_reload',
19
+ 'maad_subscriptions',
20
+ 'maad_issue_token', 'maad_revoke_token', 'maad_rotate_token',
21
+ 'maad_list_tokens', 'maad_show_token',
22
+ 'maad_backup',
23
+ ];
24
+ const ROLE_TOOLS = {
25
+ reader: READER_TOOLS,
26
+ writer: WRITER_TOOLS,
27
+ admin: ADMIN_TOOLS,
28
+ };
29
+ export function getToolsForRole(role) {
30
+ return new Set(ROLE_TOOLS[role]);
31
+ }
32
+ export function parseRole(raw) {
33
+ if (raw === 'reader' || raw === 'writer' || raw === 'admin')
34
+ return raw;
35
+ return 'reader'; // default: least privilege
36
+ }
37
+ const ROLE_RANK = { reader: 0, writer: 1, admin: 2 };
38
+ // Returns true if `have` satisfies at least the level of `need`.
39
+ export function roleSatisfies(have, need) {
40
+ return ROLE_RANK[have] >= ROLE_RANK[need];
41
+ }
42
+ // Returns the more restrictive of two roles.
43
+ export function minRole(a, b) {
44
+ return ROLE_RANK[a] <= ROLE_RANK[b] ? a : b;
45
+ }
46
+ // Inverse of getToolsForRole: for a given tool name, what's the minimum role
47
+ // that can call it? Returns null for unknown tools.
48
+ export function getMinRoleForTool(toolName) {
49
+ if (READER_TOOLS.includes(toolName))
50
+ return 'reader';
51
+ if (WRITER_TOOLS.includes(toolName))
52
+ return 'writer';
53
+ if (ADMIN_TOOLS.includes(toolName))
54
+ return 'admin';
55
+ return null;
56
+ }
57
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/mcp/roles.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAI/E,MAAM,YAAY,GAAG;IACnB,WAAW,EAAE,cAAc,EAAE,eAAe;IAC5C,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW;IACrG,aAAa,EAAE,mBAAmB,EAAE,oBAAoB;IACxD,cAAc,EAAE,YAAY;IAC5B,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,GAAG,YAAY;IACf,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB;CAC7E,CAAC;AAEX,MAAM,WAAW,GAAG;IAClB,GAAG,YAAY;IACf,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa;IAC3D,sBAAsB;IACtB,oBAAoB;IACpB,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB;IAC5D,kBAAkB,EAAE,iBAAiB;IACrC,aAAa;CACL,CAAC;AAEX,MAAM,UAAU,GAAoC;IAClD,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAuB;IAC/C,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC;IACxE,OAAO,QAAQ,CAAC,CAAC,2BAA2B;AAC9C,CAAC;AAED,MAAM,SAAS,GAAyB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAE3E,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,IAAU;IAClD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,OAAO,CAAC,CAAO,EAAE,CAAO;IACtC,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,6EAA6E;AAC7E,oDAAoD;AACpD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAK,YAAkC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5E,IAAK,YAAkC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5E,IAAK,WAAiC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC"}