@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,267 @@
1
+ // ============================================================================
2
+ // SessionRegistry — per-connection state for multi-project routing
3
+ //
4
+ // A session is created when an MCP client connects. The client binds the
5
+ // session to one project (single mode) or a whitelist (multi mode) via
6
+ // maad_use_project(s). Once bound, a session cannot rebind — it must
7
+ // disconnect and reconnect.
8
+ //
9
+ // Session IDs are derived from the MCP request context (SDK-supplied where
10
+ // possible) so the same code path works for stdio today and HTTP/SSE in 0.9.0.
11
+ // ============================================================================
12
+ import { randomUUID } from 'node:crypto';
13
+ import { ok, singleErr } from '../errors.js';
14
+ import { roleSatisfies, minRole } from '../mcp/roles.js';
15
+ import { getProject } from './config.js';
16
+ import { composeEffectiveRole } from '../auth/resolve.js';
17
+ export class SessionRegistry {
18
+ instance;
19
+ sessions = new Map();
20
+ closeHandlers = [];
21
+ createHandlers = [];
22
+ constructor(instance) {
23
+ this.instance = instance;
24
+ }
25
+ /**
26
+ * Swap the live instance config. Called by the instance-reload path after
27
+ * the pool has applied diffs. Does not touch existing sessions — cancellation
28
+ * and whitelist pruning are separate explicit calls.
29
+ */
30
+ setInstance(newInstance) {
31
+ this.instance = newInstance;
32
+ }
33
+ create(sessionId) {
34
+ const existing = this.sessions.get(sessionId);
35
+ if (existing)
36
+ return existing;
37
+ const state = {
38
+ sessionId,
39
+ mode: null,
40
+ effectiveRoles: new Map(),
41
+ bindingSource: null,
42
+ createdAt: new Date(),
43
+ lastActivityAt: new Date(),
44
+ };
45
+ this.sessions.set(sessionId, state);
46
+ // Fan-out to createHandlers — stdio uses this to register a per-session
47
+ // notifier once the synthesized stdio session ID becomes known. Cheap
48
+ // synchronous call path; handlers must be best-effort and non-throwing.
49
+ for (const h of this.createHandlers) {
50
+ try {
51
+ h(sessionId);
52
+ }
53
+ catch { /* best-effort fan-out */ }
54
+ }
55
+ return state;
56
+ }
57
+ get(sessionId) {
58
+ const state = this.sessions.get(sessionId);
59
+ if (state)
60
+ state.lastActivityAt = new Date();
61
+ return state;
62
+ }
63
+ /**
64
+ * Peek without bumping lastActivityAt. Used by the idle sweeper — it must
65
+ * not reset the very activity timestamp it's checking against.
66
+ */
67
+ peek(sessionId) {
68
+ return this.sessions.get(sessionId);
69
+ }
70
+ /**
71
+ * Register a handler fired when a session is destroyed, regardless of cause.
72
+ * Handlers should be cheap (syncronous, no throws); failures in one handler
73
+ * must not block others. Multiple handlers compose in registration order.
74
+ */
75
+ registerCloseHandler(handler) {
76
+ this.closeHandlers.push(handler);
77
+ }
78
+ /**
79
+ * 0.6.11 — Register a handler fired when a session is created. Used by
80
+ * stdio mode to register a notifier once the synthesized stdio session ID
81
+ * becomes known (HTTP knows the sid earlier via onsessioninitialized).
82
+ * Same best-effort / non-throwing contract as closeHandlers.
83
+ */
84
+ registerCreateHandler(handler) {
85
+ this.createHandlers.push(handler);
86
+ }
87
+ destroy(sessionId, reason = 'client') {
88
+ if (!this.sessions.has(sessionId))
89
+ return;
90
+ this.sessions.delete(sessionId);
91
+ for (const h of this.closeHandlers) {
92
+ try {
93
+ h(sessionId, reason);
94
+ }
95
+ catch { /* best-effort fan-out */ }
96
+ }
97
+ }
98
+ size() {
99
+ return this.sessions.size;
100
+ }
101
+ /**
102
+ * Iterate session snapshots without triggering lastActivityAt updates.
103
+ * Returned array is a copy — safe to mutate during iteration (the sweeper
104
+ * calls destroy() which mutates the underlying map).
105
+ */
106
+ snapshot() {
107
+ return Array.from(this.sessions.values());
108
+ }
109
+ /**
110
+ * Mark sessions whose single-mode binding (or gateway-pin) targets the
111
+ * named project as `cancelled`. The next tool call on a cancelled session
112
+ * returns SESSION_CANCELLED and then destroys the session. Multi-mode
113
+ * sessions are NOT cancelled here — use `pruneProjectFromWhitelist` for
114
+ * those. Returns the session IDs that were cancelled.
115
+ */
116
+ cancelByProject(projectName) {
117
+ const cancelled = [];
118
+ for (const state of this.sessions.values()) {
119
+ if (state.mode === 'single' && state.activeProject === projectName) {
120
+ state.cancelled = true;
121
+ cancelled.push(state.sessionId);
122
+ }
123
+ }
124
+ return cancelled;
125
+ }
126
+ /**
127
+ * Remove a project from multi-mode sessions' whitelist + effectiveRoles.
128
+ * Single-mode sessions are not touched (handled by `cancelByProject`).
129
+ * A multi-mode session whose whitelist becomes empty after pruning is
130
+ * marked cancelled — it has no remaining projects to route to.
131
+ * Returns { prunedSessions, cancelledSessions } lists.
132
+ */
133
+ pruneProjectFromWhitelist(projectName) {
134
+ const pruned = [];
135
+ const cancelledFromEmpty = [];
136
+ for (const state of this.sessions.values()) {
137
+ if (state.mode !== 'multi')
138
+ continue;
139
+ const listHadProject = state.whitelist?.includes(projectName) ?? false;
140
+ if (!listHadProject)
141
+ continue;
142
+ state.whitelist = state.whitelist.filter(n => n !== projectName);
143
+ state.effectiveRoles.delete(projectName);
144
+ pruned.push(state.sessionId);
145
+ if (state.whitelist.length === 0) {
146
+ state.cancelled = true;
147
+ cancelledFromEmpty.push(state.sessionId);
148
+ }
149
+ }
150
+ return { prunedSessions: pruned, cancelledSessions: cancelledFromEmpty };
151
+ }
152
+ bindSingle(sessionId, projectName, opts = {}) {
153
+ const state = this.sessions.get(sessionId);
154
+ if (!state)
155
+ return singleErr('SESSION_UNBOUND', `Unknown session: ${sessionId}`);
156
+ if (state.bindingSource === 'gateway_pin') {
157
+ return singleErr('SESSION_PINNED', `session is pinned to project '${state.activeProject}' by gateway; open a new session with a different X-Maad-Pin-Project header to switch projects`);
158
+ }
159
+ if (state.mode !== null) {
160
+ return singleErr('SESSION_ALREADY_BOUND', 'Session already bound — disconnect and reconnect to rebind');
161
+ }
162
+ const project = getProject(this.instance, projectName);
163
+ if (!project)
164
+ return singleErr('PROJECT_UNKNOWN', `Project "${projectName}" not declared in instance`);
165
+ const effective = this.composeEffective(project.role, projectName, state.token, opts.as);
166
+ if (!effective.ok)
167
+ return effective;
168
+ state.mode = 'single';
169
+ state.activeProject = projectName;
170
+ state.effectiveRoles.set(projectName, effective.value);
171
+ state.bindingSource = opts.source ?? 'client_tool';
172
+ state.lastActivityAt = new Date();
173
+ return ok(state);
174
+ }
175
+ bindMulti(sessionId, projectNames, opts = {}) {
176
+ const state = this.sessions.get(sessionId);
177
+ if (!state)
178
+ return singleErr('SESSION_UNBOUND', `Unknown session: ${sessionId}`);
179
+ if (state.bindingSource === 'gateway_pin') {
180
+ return singleErr('SESSION_PINNED', `session is pinned to project '${state.activeProject}' by gateway; open a new session with a different X-Maad-Pin-Project header to switch projects`);
181
+ }
182
+ if (state.mode !== null) {
183
+ return singleErr('SESSION_ALREADY_BOUND', 'Session already bound — disconnect and reconnect to rebind');
184
+ }
185
+ if (projectNames.length === 0) {
186
+ return singleErr('INSTANCE_CONFIG_INVALID', 'bindMulti requires at least one project name');
187
+ }
188
+ const effectiveRoles = new Map();
189
+ for (const name of projectNames) {
190
+ const project = getProject(this.instance, name);
191
+ if (!project)
192
+ return singleErr('PROJECT_UNKNOWN', `Project "${name}" not declared in instance`);
193
+ const effective = this.composeEffective(project.role, name, state.token, opts.as);
194
+ if (!effective.ok)
195
+ return effective;
196
+ effectiveRoles.set(name, effective.value);
197
+ }
198
+ state.mode = 'multi';
199
+ state.whitelist = [...projectNames];
200
+ state.effectiveRoles = effectiveRoles;
201
+ state.bindingSource = opts.source ?? 'client_tool';
202
+ state.lastActivityAt = new Date();
203
+ return ok(state);
204
+ }
205
+ /**
206
+ * Compose the effective role for a (project, token?, requested?) tuple.
207
+ * Three-cap when a token is present (HTTP+registry mode); two-cap legacy
208
+ * behavior when token is undefined (stdio, synthetic, or any path that
209
+ * never populated state.token).
210
+ */
211
+ composeEffective(projectRole, projectName, token, requested) {
212
+ if (token === undefined) {
213
+ // Legacy two-cap path — stdio/synthetic mode.
214
+ if (!requested)
215
+ return ok(projectRole);
216
+ if (!roleSatisfies(projectRole, requested)) {
217
+ return singleErr('ROLE_UPGRADE_DENIED', `Cannot bind as ${requested} — project role is ${projectRole}`);
218
+ }
219
+ return ok(minRole(projectRole, requested));
220
+ }
221
+ // Three-cap path — HTTP+registry mode.
222
+ const composed = composeEffectiveRole(projectRole, token, projectName, requested);
223
+ if (!composed.ok) {
224
+ return singleErr(composed.code, composed.message);
225
+ }
226
+ return ok(composed.role);
227
+ }
228
+ }
229
+ // Session ID resolution. MCP SDK v1.29+ exposes a session identifier via
230
+ // request meta in some transports. Where it's unavailable (stdio today),
231
+ // we synthesize one UUID per process and reuse it — stdio is single-client
232
+ // so that's equivalent to "this connection." HTTP/SSE in 0.9.0 will supply
233
+ // a real per-connection ID through transport middleware.
234
+ let processStdioSessionId = null;
235
+ // `extra` is the second arg MCP SDK passes to tool handlers (RequestHandlerExtra).
236
+ // It exposes `sessionId` when the transport supplies one (HTTP/SSE in 0.9.0).
237
+ // stdio today does not, so we fall back to a stable per-process UUID.
238
+ export function resolveSessionId(extra) {
239
+ if (extra && typeof extra === 'object') {
240
+ const sid = extra.sessionId;
241
+ if (typeof sid === 'string' && sid.length > 0)
242
+ return sid;
243
+ const meta = extra._meta;
244
+ if (meta && typeof meta === 'object') {
245
+ const metaSid = meta.sessionId;
246
+ if (typeof metaSid === 'string' && metaSid.length > 0)
247
+ return metaSid;
248
+ }
249
+ const params = extra.params;
250
+ if (params && typeof params === 'object') {
251
+ const paramMeta = params._meta;
252
+ if (paramMeta && typeof paramMeta === 'object') {
253
+ const paramSid = paramMeta.sessionId;
254
+ if (typeof paramSid === 'string' && paramSid.length > 0)
255
+ return paramSid;
256
+ }
257
+ }
258
+ }
259
+ if (!processStdioSessionId)
260
+ processStdioSessionId = `stdio-${randomUUID()}`;
261
+ return processStdioSessionId;
262
+ }
263
+ // Test hook — resets the stdio fallback. Production code never calls this.
264
+ export function __resetStdioSessionId() {
265
+ processStdioSessionId = null;
266
+ }
267
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/instance/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { type Logger, type DestinationStream } from 'pino';
2
+ export interface LoggingOptions {
3
+ level?: string;
4
+ pretty?: boolean;
5
+ auditPath?: string;
6
+ opsDestination?: DestinationStream;
7
+ auditDestination?: DestinationStream;
8
+ }
9
+ export declare function initLogging(opts?: LoggingOptions): void;
10
+ export declare function getOpsLog(): Logger;
11
+ export declare function getAuditLog(): Logger;
12
+ export declare function readLoggingEnv(): LoggingOptions;
13
+ export interface ToolCallLogFields {
14
+ request_id: string;
15
+ session_id: string;
16
+ project: string | null;
17
+ tool: string;
18
+ role: string | null;
19
+ payload_size: number;
20
+ latency_ms: number;
21
+ result: 'ok' | 'error';
22
+ error_code: string | null;
23
+ }
24
+ export declare function logToolCall(fields: ToolCallLogFields): void;
25
+ export interface WriteAuditFields {
26
+ request_id: string;
27
+ session_id: string;
28
+ project: string;
29
+ tool: string;
30
+ doc_id: string | null;
31
+ doc_ids?: string[];
32
+ doc_type: string | null;
33
+ version_before: number | null;
34
+ version_after: number | null;
35
+ changed_fields: string[];
36
+ git_commit: string | null;
37
+ token_id?: string;
38
+ agent_id?: string;
39
+ user_id?: string;
40
+ role?: string;
41
+ }
42
+ export declare function logWriteAudit(fields: WriteAuditFields): void;
43
+ export interface AuthFailureFields {
44
+ remote_addr: string;
45
+ reason: 'missing' | 'invalid';
46
+ }
47
+ export declare function logAuthFailure(fields: AuthFailureFields): void;
48
+ export interface PinRejectedFields {
49
+ remote_addr: string;
50
+ code: 'PIN_PROJECT_INVALID' | 'PIN_PROJECT_NOT_FOUND' | 'PIN_ON_EXISTING_SESSION';
51
+ project: string | null;
52
+ }
53
+ export declare function logPinRejected(fields: PinRejectedFields): void;
54
+ export interface ValidationWarningFields {
55
+ request_id: string;
56
+ session_id: string;
57
+ project: string;
58
+ tool: string;
59
+ doc_id: string | null;
60
+ doc_type: string | null;
61
+ field: string;
62
+ code: string;
63
+ message: string;
64
+ }
65
+ export declare function logValidationWarning(fields: ValidationWarningFields): void;
66
+ export interface InstanceReloadAuditFields {
67
+ source: 'tool' | 'sighup';
68
+ projectsAdded: number;
69
+ projectsRemoved: number;
70
+ projectsAddedNames: string[];
71
+ projectsRemovedNames: string[];
72
+ sessionsCancelled: number;
73
+ sessionsPruned: number;
74
+ durationMs: number;
75
+ }
76
+ export declare function logInstanceReload(fields: InstanceReloadAuditFields): void;
77
+ export interface InstanceReloadProgressFields {
78
+ source: 'tool' | 'sighup';
79
+ phase: 'start' | 'complete' | 'failed';
80
+ code?: string;
81
+ message?: string;
82
+ projectsAdded?: number;
83
+ projectsRemoved?: number;
84
+ durationMs?: number;
85
+ }
86
+ export declare function logInstanceReloadProgress(fields: InstanceReloadProgressFields): void;
87
+ export interface OpsChannelReadyFields {
88
+ destination: 'stderr' | 'pretty' | 'custom';
89
+ level: string;
90
+ pid: number;
91
+ }
92
+ export declare function logOpsChannelReady(fields: OpsChannelReadyFields): void;
93
+ export interface SchemaCacheStaleFields {
94
+ project: string | null;
95
+ trigger_op: string;
96
+ changed_files: string[];
97
+ }
98
+ export declare function logSchemaCacheStale(fields: SchemaCacheStaleFields): void;
99
+ export interface CommitFailureFields {
100
+ code: string;
101
+ message: string;
102
+ action: 'create' | 'update' | 'delete';
103
+ doc_id: string;
104
+ doc_type: string;
105
+ file_count: number;
106
+ }
107
+ export declare function logCommitFailure(fields: CommitFailureFields): void;
108
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAkBA,OAAa,EAAE,KAAK,MAAM,EAAE,KAAK,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAYjE,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;CACtC;AA4CD,wBAAgB,WAAW,CAAC,IAAI,GAAE,cAAmB,GAAG,IAAI,CAG3D;AAKD,wBAAgB,SAAS,IAAI,MAAM,CAAmB;AACtD,wBAAgB,WAAW,IAAI,MAAM,CAAqB;AAE1D,wBAAgB,cAAc,IAAI,cAAc,CAM/C;AAID,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE3D;AAID,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAE5D;AAID,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE9D;AAQD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;IAClF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE9D;AASD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAE1E;AAQD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAEzE;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI,CAOpF;AAUD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAEtE;AAUD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAExE;AASD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAElE"}
@@ -0,0 +1,120 @@
1
+ // ============================================================================
2
+ // Logging — two pino loggers, ops + audit.
3
+ //
4
+ // opsLog one line per MCP tool call, plus engine-layer events (write_slow,
5
+ // shutdown_start, etc.). Level env-tunable. Redacts authorization
6
+ // and common token fields.
7
+ //
8
+ // auditLog one line per successful write. Before/after version, changed
9
+ // fields, git commit SHA. Separable to a dedicated file via
10
+ // MAAD_AUDIT_PATH for operators who want an append-only audit trail.
11
+ //
12
+ // Both are pino instances — fast JSON, zero overhead for gated levels,
13
+ // first-class redaction. Test hook: resetLoggers() lets tests inject a
14
+ // destination (via environment + pino transports) or capture output via a
15
+ // child with a memory destination. See tests/mcp/logging.test.ts for the
16
+ // pattern.
17
+ // ============================================================================
18
+ import pino from 'pino';
19
+ import { createWriteStream } from 'node:fs';
20
+ const REDACT_PATHS = [
21
+ 'args.authorization',
22
+ 'args.token',
23
+ 'args.bearer',
24
+ 'args.headers.authorization',
25
+ 'authorization',
26
+ 'headers.authorization',
27
+ ];
28
+ let opsLog;
29
+ let auditLog;
30
+ // Default log destination is stderr (fd 2), not stdout. In stdio MCP transport
31
+ // mode, stdout IS the JSON-RPC channel — any non-protocol bytes written there
32
+ // (including pino log lines) corrupt the frame stream and the client
33
+ // disconnects. stderr is safe for both transports; HTTP operators can still
34
+ // redirect it wherever they like.
35
+ function defaultDestination() {
36
+ return pino.destination({ fd: 2, sync: false });
37
+ }
38
+ function buildOps(opts) {
39
+ const level = opts.level ?? process.env.MAAD_LOG_LEVEL ?? 'info';
40
+ if (opts.opsDestination) {
41
+ return pino({ level, redact: { paths: REDACT_PATHS, censor: '[redacted]' } }, opts.opsDestination);
42
+ }
43
+ if (opts.pretty ?? process.env.MAAD_LOG_PRETTY === '1') {
44
+ return pino({
45
+ level,
46
+ redact: { paths: REDACT_PATHS, censor: '[redacted]' },
47
+ transport: { target: 'pino-pretty', options: { colorize: true, destination: 2 } },
48
+ });
49
+ }
50
+ return pino({ level, redact: { paths: REDACT_PATHS, censor: '[redacted]' } }, defaultDestination());
51
+ }
52
+ function buildAudit(opts) {
53
+ // Audit is always 'info' — it records discrete state changes, level gating
54
+ // would defeat its purpose.
55
+ const level = 'info';
56
+ if (opts.auditDestination) {
57
+ return pino({ level, base: { channel: 'audit' } }, opts.auditDestination);
58
+ }
59
+ const auditPath = opts.auditPath ?? process.env.MAAD_AUDIT_PATH;
60
+ if (auditPath && auditPath.length > 0) {
61
+ const stream = createWriteStream(auditPath, { flags: 'a' });
62
+ return pino({ level, base: { channel: 'audit' } }, stream);
63
+ }
64
+ return pino({ level, base: { channel: 'audit' } }, defaultDestination());
65
+ }
66
+ export function initLogging(opts = {}) {
67
+ opsLog = buildOps(opts);
68
+ auditLog = buildAudit(opts);
69
+ }
70
+ // Eager default — safe to call getOpsLog()/getAuditLog() before initLogging().
71
+ initLogging();
72
+ export function getOpsLog() { return opsLog; }
73
+ export function getAuditLog() { return auditLog; }
74
+ export function readLoggingEnv() {
75
+ const opts = {};
76
+ if (process.env.MAAD_LOG_LEVEL)
77
+ opts.level = process.env.MAAD_LOG_LEVEL;
78
+ if (process.env.MAAD_LOG_PRETTY === '1')
79
+ opts.pretty = true;
80
+ if (process.env.MAAD_AUDIT_PATH)
81
+ opts.auditPath = process.env.MAAD_AUDIT_PATH;
82
+ return opts;
83
+ }
84
+ export function logToolCall(fields) {
85
+ opsLog.info(fields, 'tool_call');
86
+ }
87
+ export function logWriteAudit(fields) {
88
+ auditLog.info(fields, 'write');
89
+ }
90
+ export function logAuthFailure(fields) {
91
+ opsLog.info(fields, 'auth_failure');
92
+ }
93
+ export function logPinRejected(fields) {
94
+ opsLog.info(fields, 'pin_rejected');
95
+ }
96
+ export function logValidationWarning(fields) {
97
+ opsLog.warn(fields, 'validation_warning');
98
+ }
99
+ export function logInstanceReload(fields) {
100
+ auditLog.info(fields, 'instance_reload');
101
+ }
102
+ export function logInstanceReloadProgress(fields) {
103
+ const eventName = `instance_reload_${fields.phase}`;
104
+ if (fields.phase === 'failed') {
105
+ opsLog.warn(fields, eventName);
106
+ }
107
+ else {
108
+ opsLog.info(fields, eventName);
109
+ }
110
+ }
111
+ export function logOpsChannelReady(fields) {
112
+ opsLog.info(fields, 'ops_channel_ready');
113
+ }
114
+ export function logSchemaCacheStale(fields) {
115
+ opsLog.warn(fields, 'schema_cache_stale');
116
+ }
117
+ export function logCommitFailure(fields) {
118
+ opsLog.warn(fields, 'commit_failed');
119
+ }
120
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Registry, SchemaStore, BackendStats } from './types.js';
2
+ export interface MaadMdContext {
3
+ projectRoot: string;
4
+ enginePath: string;
5
+ registry: Registry;
6
+ schemaStore: SchemaStore;
7
+ stats: BackendStats | null;
8
+ }
9
+ export declare function generateMaadMd(ctx: MaadMdContext): string;
10
+ export declare function generateStubMaadMd(enginePath: string, projectRoot: string): string;
11
+ //# sourceMappingURL=maad-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maad-md.d.ts","sourceRoot":"","sources":["../src/maad-md.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAazD;AA8ND,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAqBlF"}