@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,97 @@
1
+ // ============================================================================
2
+ // Transport telemetry — process-level counters surfaced by maad_health.
3
+ //
4
+ // Holds the transport posture (kind/host/port/startedAt) decided at boot and
5
+ // session lifecycle counters fed by the HTTP transport. Stdio initializes the
6
+ // transport block with kind=stdio and leaves the session counters at zero —
7
+ // stdio is a single implicit session so open/close events aren't emitted.
8
+ // ============================================================================
9
+ import { getAuditLog, getOpsLog } from '../../logging.js';
10
+ let state = null;
11
+ export function initTransportTelemetry(info) {
12
+ const now = Date.now();
13
+ state = {
14
+ info: {
15
+ kind: info.kind,
16
+ host: info.host,
17
+ port: info.port,
18
+ socketPath: info.socketPath,
19
+ startedAt: new Date(now).toISOString(),
20
+ },
21
+ startedAtMs: now,
22
+ counters: {
23
+ openedTotal: 0,
24
+ closedTotal: 0,
25
+ lastOpenedAt: null,
26
+ lastClosedAt: null,
27
+ idleSweepLastRunAt: null,
28
+ },
29
+ openedAtMsBySession: new Map(),
30
+ };
31
+ }
32
+ /**
33
+ * Test hook — resets telemetry state so each test starts clean.
34
+ */
35
+ export function __resetTransportTelemetry() {
36
+ state = null;
37
+ }
38
+ export function recordSessionOpen(fields) {
39
+ // Safe no-op when telemetry is uninitialized. Test harnesses exercise the
40
+ // transport in isolation without calling startServer — they shouldn't have
41
+ // to bootstrap telemetry just to run a smoke test.
42
+ if (!state)
43
+ return;
44
+ const now = Date.now();
45
+ state.counters.openedTotal += 1;
46
+ state.counters.lastOpenedAt = new Date(now).toISOString();
47
+ state.openedAtMsBySession.set(fields.session_id, now);
48
+ getAuditLog().info(fields, 'session_open');
49
+ }
50
+ export function recordSessionClose(args) {
51
+ if (!state)
52
+ return;
53
+ const now = Date.now();
54
+ const openedAt = state.openedAtMsBySession.get(args.session_id);
55
+ const durationMs = openedAt !== undefined ? now - openedAt : 0;
56
+ if (openedAt !== undefined)
57
+ state.openedAtMsBySession.delete(args.session_id);
58
+ state.counters.closedTotal += 1;
59
+ state.counters.lastClosedAt = new Date(now).toISOString();
60
+ const fields = {
61
+ session_id: args.session_id,
62
+ reason: args.reason,
63
+ duration_ms: durationMs,
64
+ };
65
+ getAuditLog().info(fields, 'session_close');
66
+ }
67
+ export function recordIdleSweep(fields) {
68
+ if (!state)
69
+ return;
70
+ state.counters.idleSweepLastRunAt = new Date().toISOString();
71
+ getOpsLog().info(fields, 'idle_sweep');
72
+ }
73
+ export function getTransportSnapshot(activeSessions, pinnedSessions = 0) {
74
+ if (!state)
75
+ throw new Error('transport telemetry not initialized');
76
+ const s = state;
77
+ const kind = s.info.kind;
78
+ const uptimeSeconds = Math.max(0, Math.floor((Date.now() - s.startedAtMs) / 1000));
79
+ const transport = kind === 'http'
80
+ ? { kind, host: s.info.host, port: s.info.port, uptimeSeconds }
81
+ : kind === 'unix'
82
+ ? { kind, socketPath: s.info.socketPath, uptimeSeconds }
83
+ : { kind, uptimeSeconds };
84
+ // Stdio is a single implicit session — cap reported active at 1 regardless
85
+ // of registry state so the contract in the spec holds. Pinned is always 0
86
+ // on stdio (header plumbing is HTTP-only).
87
+ const active = kind === 'stdio' ? Math.min(1, activeSessions) : activeSessions;
88
+ const pinned = kind === 'stdio' ? 0 : pinnedSessions;
89
+ return {
90
+ transport,
91
+ sessions: { active, pinned, ...s.counters },
92
+ };
93
+ }
94
+ export function isInitialized() {
95
+ return state !== null;
96
+ }
97
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/mcp/transport/telemetry.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,+EAA+E;AAG/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAkD1D,IAAI,KAAK,GAAiB,IAAI,CAAC;AAE/B,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,GAAG;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;SACvC;QACD,WAAW,EAAE,GAAG;QAChB,QAAQ,EAAE;YACR,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,IAAI;YAClB,kBAAkB,EAAE,IAAI;SACzB;QACD,mBAAmB,EAAE,IAAI,GAAG,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC;AAkBD,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,0EAA0E;IAC1E,2EAA2E;IAC3E,mDAAmD;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;IAChC,KAAK,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtD,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,IAAwD;IACzF,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9E,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;IAChC,KAAK,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAuB;QACjC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,UAAU;KACxB,CAAC;IACF,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC;AAOD,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,cAAsB,EAAE,cAAc,GAAG,CAAC;IAC7E,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,KAAK,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnF,MAAM,SAAS,GACb,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;QAC/D,CAAC,CAAC,IAAI,KAAK,MAAM;YACf,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YACxD,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAChC,2EAA2E;IAC3E,0EAA0E;IAC1E,2CAA2C;IAC3C,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAC/E,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACrD,OAAO;QACL,SAAS;QACT,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { MaadEngine } from '../engine.js';
2
+ import type { InstanceCtx } from './ctx.js';
3
+ interface CallContext {
4
+ engine: MaadEngine;
5
+ projectName: string;
6
+ projectRoot: string;
7
+ sessionId: string;
8
+ requestId: string;
9
+ /**
10
+ * 0.7.0 — Identity snapshot for audit + commit propagation. `role` is the
11
+ * effective role resolved for this (session × project). `token` is
12
+ * populated when the session was authenticated via the HTTP+registry path;
13
+ * undefined for stdio / synthetic mode.
14
+ */
15
+ role: string;
16
+ token?: import('../auth/types.js').TokenRecord;
17
+ }
18
+ type McpToolResponse = {
19
+ content: Array<{
20
+ type: 'text';
21
+ text: string;
22
+ }>;
23
+ };
24
+ export declare function withEngine(ctx: InstanceCtx, extra: unknown, toolName: string, args: Record<string, unknown> | undefined, handler: (call: CallContext) => Promise<McpToolResponse> | McpToolResponse): Promise<McpToolResponse>;
25
+ export {};
26
+ //# sourceMappingURL=with-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-session.d.ts","sourceRoot":"","sources":["../../src/mcp/with-session.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAmB5C,UAAU,WAAW;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,kBAAkB,EAAE,WAAW,CAAC;CAChD;AAED,KAAK,eAAe,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAa1E,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,GACzE,OAAO,CAAC,eAAe,CAAC,CA+N1B"}
@@ -0,0 +1,275 @@
1
+ // ============================================================================
2
+ // withEngine — the routing helper every project-level tool wraps around.
3
+ //
4
+ // Resolves the correct engine for the current MCP call:
5
+ // 1. Pull/create the session from the request's sessionId.
6
+ // 2. In legacy (synthetic) mode, auto-bind to the single project on first
7
+ // call so existing 0.2.x clients work unchanged.
8
+ // 3. In real instance mode, require the client to have already bound via
9
+ // maad_use_project(s).
10
+ // 4. Pick the project (activeProject in single mode, args.project in multi).
11
+ // 5. Gate by tool's minimum role vs the session's effective role.
12
+ // 6. Load/cache the engine via EnginePool.
13
+ // 7. Hand engine + project meta to the inner handler.
14
+ // ============================================================================
15
+ import { randomUUID } from 'node:crypto';
16
+ import { resolveSessionId } from '../instance/session.js';
17
+ import { getMinRoleForTool, roleSatisfies } from './roles.js';
18
+ import { errorResponse, attachMeta } from './response.js';
19
+ import { getRateLimiter } from './rate-limit.js';
20
+ import { logToolCall, getOpsLog } from '../logging.js';
21
+ import { isShuttingDown } from './shutdown.js';
22
+ import { getKindForTool, isEngineLess } from './kinds.js';
23
+ import { isCommitIdentityEnabled } from '../git/commit.js';
24
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
25
+ function getRequestTimeoutMs() {
26
+ const env = process.env.MAAD_REQUEST_TIMEOUT_MS;
27
+ if (env && !Number.isNaN(Number(env)))
28
+ return Number(env);
29
+ return DEFAULT_REQUEST_TIMEOUT_MS;
30
+ }
31
+ // Wrap a tool handler so it runs against the engine chosen by the current
32
+ // session. Call this inside every project-level tool registration.
33
+ //
34
+ // Every call gets a fresh request_id (UUID). It is:
35
+ // - stamped onto the response as _meta.request_id
36
+ // - emitted on the ops log in the trailing tool_call line
37
+ // - passed into the handler (so audit logs and idempotency can reference it)
38
+ //
39
+ // The function has several early-return points (session errors, role, payload,
40
+ // concurrent). All of them flow through `finalize()` so every response — success
41
+ // or rejection — is logged uniformly.
42
+ export async function withEngine(ctx, extra, toolName, args, handler) {
43
+ const requestId = randomUUID();
44
+ const startedMs = Date.now();
45
+ const sessionId = resolveSessionId(extra);
46
+ const payloadBytes = args ? Buffer.byteLength(JSON.stringify(args), 'utf8') : 0;
47
+ let projectForLog = null;
48
+ let roleForLog = null;
49
+ // finalize() is called once per request, on the single return path. It
50
+ // attaches _meta.request_id (opt-in via MAAD_EMIT_REQUEST_ID=true since
51
+ // 0.7.0), inspects the response body for logging, and emits the tool_call
52
+ // ops line. The log line always carries request_id regardless of stamping
53
+ // — emission only affects the wire response, not diagnostics.
54
+ const emitRequestId = process.env.MAAD_EMIT_REQUEST_ID === 'true';
55
+ const finalize = (response) => {
56
+ const stamped = emitRequestId ? attachMeta(response, { request_id: requestId }) : response;
57
+ const latencyMs = Date.now() - startedMs;
58
+ const { result, errorCode } = inspectResponse(stamped);
59
+ logToolCall({
60
+ request_id: requestId,
61
+ session_id: sessionId,
62
+ project: projectForLog,
63
+ tool: toolName,
64
+ role: roleForLog,
65
+ payload_size: payloadBytes,
66
+ latency_ms: latencyMs,
67
+ result,
68
+ error_code: errorCode,
69
+ });
70
+ return stamped;
71
+ };
72
+ // Reject new work during shutdown before any other check.
73
+ if (isShuttingDown()) {
74
+ return finalize(mcpError('SHUTTING_DOWN', 'Server is shutting down; retry against a healthy instance.'));
75
+ }
76
+ let state = ctx.sessions.get(sessionId);
77
+ if (!state)
78
+ state = ctx.sessions.create(sessionId);
79
+ // Session cancelled by instance-reload (its bound project was removed, or
80
+ // its multi-mode whitelist drained to empty). Emit the error once, then
81
+ // destroy so the client reconnects cleanly.
82
+ if (state.cancelled) {
83
+ const boundProject = state.activeProject ?? state.whitelist?.[0] ?? 'unknown';
84
+ ctx.sessions.destroy(sessionId, 'transport');
85
+ return finalize(mcpError('SESSION_CANCELLED', `Session was cancelled because its bound project "${boundProject}" was removed by an instance reload. Reconnect to continue.`));
86
+ }
87
+ // Legacy single-project instance: auto-bind to 'default' on first call.
88
+ if (state.mode === null && ctx.instance.source === 'synthetic') {
89
+ const bindResult = ctx.sessions.bindSingle(sessionId, 'default');
90
+ if (!bindResult.ok)
91
+ return finalize(errorResponse(bindResult.errors));
92
+ state = bindResult.value;
93
+ }
94
+ if (state.mode === null) {
95
+ return finalize(mcpError('SESSION_UNBOUND', 'No project bound for this session. Call maad_use_project(s) first.'));
96
+ }
97
+ // Pick project
98
+ const projectName = resolveProjectName(state, args);
99
+ if (typeof projectName !== 'string')
100
+ return finalize(projectName); // error response
101
+ projectForLog = projectName;
102
+ // Role check
103
+ const effectiveRole = state.effectiveRoles.get(projectName);
104
+ if (!effectiveRole) {
105
+ return finalize(mcpError('PROJECT_NOT_WHITELISTED', `Session is not bound to project "${projectName}".`));
106
+ }
107
+ roleForLog = effectiveRole;
108
+ const minRole = getMinRoleForTool(toolName);
109
+ if (minRole && !roleSatisfies(effectiveRole, minRole)) {
110
+ return finalize(mcpError('INSUFFICIENT_ROLE', `Tool ${toolName} requires role "${minRole}" but session has "${effectiveRole}" for project "${projectName}".`));
111
+ }
112
+ // Payload size cap. Oversize args are rejected without touching the engine.
113
+ const rl = getRateLimiter();
114
+ const payloadRejection = rl.checkPayloadSize(payloadBytes);
115
+ if (payloadRejection) {
116
+ return finalize(mcpErrorWithDetails('RATE_LIMITED', 'Payload exceeds limit', {
117
+ reason: payloadRejection.reason,
118
+ limit: payloadRejection.limit,
119
+ retryAfterMs: payloadRejection.retryAfterMs,
120
+ size: payloadBytes,
121
+ }));
122
+ }
123
+ // Concurrent-in-flight cap. Released in the `finally` below so an engine
124
+ // error never leaks a slot.
125
+ const slot = rl.tryAcquireConcurrent(sessionId);
126
+ if (!slot.ok) {
127
+ return finalize(mcpErrorWithDetails('RATE_LIMITED', 'Concurrent in-flight limit reached', {
128
+ reason: slot.rejection.reason,
129
+ limit: slot.rejection.limit,
130
+ retryAfterMs: slot.rejection.retryAfterMs,
131
+ }));
132
+ }
133
+ let acquiredProject = null;
134
+ try {
135
+ // Resolve engine
136
+ const poolResult = await ctx.pool.get(projectName);
137
+ if (!poolResult.ok)
138
+ return finalize(errorResponse(poolResult.errors));
139
+ // 0.7.3 — refcount the engine for the duration of this handler so the
140
+ // idle sweeper cannot evict mid-call. Released in finally below.
141
+ ctx.pool.acquire(projectName);
142
+ acquiredProject = projectName;
143
+ const project = ctx.instance.projects.find((p) => p.name === projectName);
144
+ // Operation kind dispatch. Reads invoke the handler directly; writes
145
+ // acquire the per-engine write mutex via engine.runExclusive so
146
+ // mutations across tools, sessions, and transports all serialize
147
+ // through a single chokepoint. An unclassified tool that reaches
148
+ // withEngine (i.e. not in kinds.ts) is a bug — fail fast with a clear
149
+ // code rather than silently running a write without the mutex.
150
+ const kind = getKindForTool(toolName);
151
+ if (kind === null && !isEngineLess(toolName)) {
152
+ return finalize(mcpError('MISSING_OPERATION_KIND', `Tool "${toolName}" has no OperationKind registered in src/mcp/kinds.ts. ` +
153
+ `Every engine-bound tool must be listed as read or write.`));
154
+ }
155
+ // Per-request timeout via Promise.race. The handler continues running
156
+ // on timeout (cooperative cancellation into engine stages is deferred to
157
+ // 0.8.5 — documented in docs/gaps.md). Its eventual completion emits a
158
+ // delayed `tool_call_overrun` log line so operators can see what the
159
+ // slow work was doing.
160
+ const timeoutMs = getRequestTimeoutMs();
161
+ const callCtx = {
162
+ engine: poolResult.value,
163
+ projectName,
164
+ projectRoot: project.path,
165
+ sessionId,
166
+ requestId,
167
+ role: effectiveRole,
168
+ };
169
+ if (state.token !== undefined)
170
+ callCtx.token = state.token;
171
+ const invokeHandler = () => Promise.resolve(handler(callCtx));
172
+ // 0.7.0 — For writes under an authenticated session with the identity
173
+ // flag on, set the engine's pending commit-identity slot inside the
174
+ // write mutex. This survives the full handler scope; cleared in finally.
175
+ // AsyncLocalStorage-based reentrancy means inner engine.createDocument
176
+ // calls reuse the already-held mutex, so the slot is safe.
177
+ const runWithIdentity = async () => {
178
+ const engine = poolResult.value;
179
+ if (state.token && isCommitIdentityEnabled()) {
180
+ const identity = { role: effectiveRole };
181
+ identity.tokenId = state.token.id;
182
+ if (state.token.agentId !== undefined)
183
+ identity.agentId = state.token.agentId;
184
+ if (state.token.userId !== undefined)
185
+ identity.userId = state.token.userId;
186
+ engine.setCommitIdentity(identity);
187
+ }
188
+ try {
189
+ return await invokeHandler();
190
+ }
191
+ finally {
192
+ engine.setCommitIdentity(undefined);
193
+ }
194
+ };
195
+ const handlerPromise = kind === 'write'
196
+ ? poolResult.value.runExclusive(toolName, runWithIdentity)
197
+ : invokeHandler();
198
+ let timedOut = false;
199
+ let timeoutHandle = null;
200
+ const timeoutPromise = new Promise((resolve) => {
201
+ timeoutHandle = setTimeout(() => {
202
+ timedOut = true;
203
+ resolve(mcpErrorWithDetails('REQUEST_TIMEOUT', `Tool ${toolName} exceeded per-request timeout of ${timeoutMs}ms`, { tool: toolName, limitMs: timeoutMs }));
204
+ }, timeoutMs);
205
+ // Don't keep the event loop alive for a pending request timer —
206
+ // process exit stays clean when all real work is done.
207
+ timeoutHandle.unref?.();
208
+ });
209
+ let response;
210
+ try {
211
+ response = await Promise.race([handlerPromise, timeoutPromise]);
212
+ }
213
+ finally {
214
+ // Clear the timer on the happy path so we don't keep ~30s of dead
215
+ // closures around per request under sustained load.
216
+ if (timeoutHandle)
217
+ clearTimeout(timeoutHandle);
218
+ }
219
+ if (timedOut) {
220
+ // Observe the handler's eventual completion and log the overrun.
221
+ // Keep the observation unhandled-rejection-safe.
222
+ void handlerPromise.then(() => {
223
+ getOpsLog().warn({ event: 'tool_call_overrun', request_id: requestId, tool: toolName, limit_ms: timeoutMs }, 'tool_call_overrun');
224
+ }, (err) => {
225
+ getOpsLog().warn({ event: 'tool_call_overrun', request_id: requestId, tool: toolName, limit_ms: timeoutMs, error: String(err) }, 'tool_call_overrun');
226
+ });
227
+ }
228
+ return finalize(response);
229
+ }
230
+ finally {
231
+ slot.release();
232
+ // 0.7.3 — release engine refcount. Paired with acquiredProject above;
233
+ // null when pool.get failed and acquire was never called.
234
+ if (acquiredProject !== null)
235
+ ctx.pool.release(acquiredProject);
236
+ }
237
+ }
238
+ function inspectResponse(response) {
239
+ const first = response.content[0];
240
+ if (!first || first.type !== 'text')
241
+ return { result: 'error', errorCode: null };
242
+ try {
243
+ const parsed = JSON.parse(first.text);
244
+ if (parsed.ok === true)
245
+ return { result: 'ok', errorCode: null };
246
+ const code = parsed.errors?.[0]?.code ?? null;
247
+ return { result: 'error', errorCode: code };
248
+ }
249
+ catch {
250
+ return { result: 'error', errorCode: null };
251
+ }
252
+ }
253
+ function resolveProjectName(state, args) {
254
+ if (state.mode === 'single') {
255
+ return state.activeProject;
256
+ }
257
+ // multi mode
258
+ const raw = args && typeof args.project === 'string' ? args.project : undefined;
259
+ if (!raw) {
260
+ return mcpError('PROJECT_REQUIRED', 'Multi-project session requires `project=<name>` on every call.');
261
+ }
262
+ if (!state.whitelist.includes(raw)) {
263
+ return mcpError('PROJECT_NOT_WHITELISTED', `Project "${raw}" is not in this session's whitelist: [${state.whitelist.join(', ')}]`);
264
+ }
265
+ return raw;
266
+ }
267
+ function mcpError(code, message) {
268
+ const err = { code: code, message };
269
+ return errorResponse([err]);
270
+ }
271
+ function mcpErrorWithDetails(code, message, details) {
272
+ const err = { code: code, message, details };
273
+ return errorResponse([err]);
274
+ }
275
+ //# sourceMappingURL=with-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-session.js","sourceRoot":"","sources":["../../src/mcp/with-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FilePath, InlineAnnotation, Primitive, VerbatimZone } from '../types.js';
2
+ export declare function extractAnnotations(body: string, bodyStartLine: number, filePath: FilePath, subtypeMap: Record<string, Primitive>, verbatimZones: VerbatimZone[]): InlineAnnotation[];
3
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/parser/annotations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMvF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACrC,aAAa,EAAE,YAAY,EAAE,GAC5B,gBAAgB,EAAE,CAoCpB"}
@@ -0,0 +1,41 @@
1
+ // ============================================================================
2
+ // Inline Annotation Extractor
3
+ // Extracts [[type:value|label]] annotations from markdown body.
4
+ // Resolves subtype -> primitive via the subtype map.
5
+ // Skips matches inside verbatim zones.
6
+ // ============================================================================
7
+ import { resolvePrimitive } from '../types.js';
8
+ import { isInVerbatimZone } from './verbatim.js';
9
+ const ANNOTATION_REGEX = /\[\[([a-zA-Z_][a-zA-Z0-9_]*):([^|]+)\|([^\]]+)\]\]/g;
10
+ export function extractAnnotations(body, bodyStartLine, filePath, subtypeMap, verbatimZones) {
11
+ const annotations = [];
12
+ const lines = body.split('\n');
13
+ for (let i = 0; i < lines.length; i++) {
14
+ const line = lines[i];
15
+ const absoluteLine = bodyStartLine + i;
16
+ let match;
17
+ ANNOTATION_REGEX.lastIndex = 0;
18
+ while ((match = ANNOTATION_REGEX.exec(line)) !== null) {
19
+ const col = match.index;
20
+ if (isInVerbatimZone(absoluteLine, col, verbatimZones))
21
+ continue;
22
+ const rawType = match[1];
23
+ const value = match[2].trim();
24
+ const label = match[3].trim();
25
+ const primitive = resolvePrimitive(rawType, subtypeMap);
26
+ annotations.push({
27
+ rawType,
28
+ primitive,
29
+ value,
30
+ label,
31
+ location: {
32
+ file: filePath,
33
+ line: absoluteLine,
34
+ col,
35
+ },
36
+ });
37
+ }
38
+ }
39
+ return annotations;
40
+ }
41
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/parser/annotations.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8BAA8B;AAC9B,gEAAgE;AAChE,qDAAqD;AACrD,uCAAuC;AACvC,+EAA+E;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,gBAAgB,GAAG,qDAAqD,CAAC;AAE/E,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,aAAqB,EACrB,QAAkB,EAClB,UAAqC,EACrC,aAA6B;IAE7B,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC;QAEvC,IAAI,KAA6B,CAAC;QAClC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;QAE/B,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;YAExB,IAAI,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;gBAAE,SAAS;YAEjE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAExD,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO;gBACP,SAAS;gBACT,KAAK;gBACL,KAAK;gBACL,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,YAAY;oBAClB,GAAG;iBACJ;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ParsedBlock } from '../types.js';
2
+ export declare function parseBlocks(body: string, bodyStartLine: number): ParsedBlock[];
3
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/parser/blocks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAMtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,EAAE,CAiG9E"}
@@ -0,0 +1,99 @@
1
+ // ============================================================================
2
+ // Block Parser
3
+ // Splits a markdown body into heading-delimited sections.
4
+ // Detects {#custom_id} anchors. Skips headings inside fenced code blocks.
5
+ // ============================================================================
6
+ import { blockId } from '../types.js';
7
+ const ATX_HEADING_REGEX = /^(#{1,6})\s+(.+)$/;
8
+ const ANCHOR_REGEX = /\s*\{#([a-zA-Z0-9_-]+)\}\s*$/;
9
+ const FENCE_OPEN_REGEX = /^(`{3,}|~{3,})/;
10
+ export function parseBlocks(body, bodyStartLine) {
11
+ const lines = body.split('\n');
12
+ const blocks = [];
13
+ let inFence = false;
14
+ let fenceChar = '';
15
+ let fenceLen = 0;
16
+ const headings = [];
17
+ for (let i = 0; i < lines.length; i++) {
18
+ const line = lines[i];
19
+ const absoluteLine = bodyStartLine + i;
20
+ // Track fenced code blocks
21
+ const fenceMatch = FENCE_OPEN_REGEX.exec(line.trimStart());
22
+ if (fenceMatch) {
23
+ const matchedFence = fenceMatch[1];
24
+ if (!inFence) {
25
+ inFence = true;
26
+ fenceChar = matchedFence[0];
27
+ fenceLen = matchedFence.length;
28
+ }
29
+ else if (line.trimStart().startsWith(fenceChar.repeat(fenceLen)) && line.trim().length <= fenceLen + 1) {
30
+ // Closing fence: same char, at least same length, nothing else on line
31
+ inFence = false;
32
+ }
33
+ continue;
34
+ }
35
+ if (inFence)
36
+ continue;
37
+ // Check for ATX heading
38
+ const headingMatch = ATX_HEADING_REGEX.exec(line);
39
+ if (headingMatch) {
40
+ const level = headingMatch[1].length;
41
+ let headingText = headingMatch[2].trim();
42
+ let id = null;
43
+ // Extract {#custom_id} anchor
44
+ const anchorMatch = ANCHOR_REGEX.exec(headingText);
45
+ if (anchorMatch) {
46
+ id = blockId(anchorMatch[1]);
47
+ headingText = headingText.slice(0, anchorMatch.index).trim();
48
+ }
49
+ else {
50
+ // Auto-generate ID by slugifying the heading
51
+ id = blockId(slugify(headingText));
52
+ }
53
+ headings.push({
54
+ id,
55
+ heading: headingText,
56
+ level,
57
+ startLine: absoluteLine,
58
+ contentStartIndex: i + 1,
59
+ });
60
+ }
61
+ }
62
+ // If there's content before the first heading, create a preamble block
63
+ const firstHeadingIndex = headings.length > 0 ? headings[0].contentStartIndex - 1 : lines.length;
64
+ if (firstHeadingIndex > 0) {
65
+ const preambleContent = lines.slice(0, firstHeadingIndex).join('\n').trim();
66
+ if (preambleContent.length > 0) {
67
+ blocks.push({
68
+ id: null,
69
+ heading: '',
70
+ level: 0,
71
+ startLine: bodyStartLine,
72
+ endLine: bodyStartLine + firstHeadingIndex - 1,
73
+ });
74
+ }
75
+ }
76
+ // Build blocks from headings
77
+ for (let h = 0; h < headings.length; h++) {
78
+ const current = headings[h];
79
+ const nextIndex = h + 1 < headings.length ? headings[h + 1].contentStartIndex - 1 : lines.length;
80
+ const endLine = bodyStartLine + nextIndex - 1;
81
+ blocks.push({
82
+ id: current.id,
83
+ heading: current.heading,
84
+ level: current.level,
85
+ startLine: current.startLine,
86
+ endLine,
87
+ });
88
+ }
89
+ return blocks;
90
+ }
91
+ function slugify(text) {
92
+ return text
93
+ .toLowerCase()
94
+ .replace(/[^a-z0-9\s-]/g, '')
95
+ .replace(/\s+/g, '-')
96
+ .replace(/-+/g, '-')
97
+ .replace(/^-|-$/g, '');
98
+ }
99
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/parser/blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Result } from '../errors.js';
2
+ import type { FilePath } from '../types.js';
3
+ export interface FrontmatterResult {
4
+ frontmatter: Record<string, unknown>;
5
+ body: string;
6
+ bodyStartLine: number;
7
+ }
8
+ export declare function parseFrontmatter(raw: string, filePath: FilePath): Result<FrontmatterResult>;
9
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CA4B3F"}
@@ -0,0 +1,33 @@
1
+ // ============================================================================
2
+ // Frontmatter Parser
3
+ // Extracts YAML frontmatter from a markdown file using gray-matter.
4
+ // ============================================================================
5
+ import { parseMatter } from './matter.js';
6
+ import { ok, singleErr } from '../errors.js';
7
+ export function parseFrontmatter(raw, filePath) {
8
+ try {
9
+ const parsed = parseMatter(raw);
10
+ if (typeof parsed.data !== 'object' || parsed.data === null || Array.isArray(parsed.data)) {
11
+ return singleErr('PARSE_ERROR', 'Frontmatter must be a YAML mapping', { file: filePath, line: 1, col: 1 });
12
+ }
13
+ const frontmatter = parsed.data;
14
+ // Calculate bodyStartLine: count lines in the raw content up to where the body begins
15
+ // gray-matter.matter gives us the raw frontmatter string between the --- delimiters
16
+ let bodyStartLine = 1;
17
+ if (parsed.matter && parsed.matter.length > 0) {
18
+ // Opening --- (line 1) + frontmatter lines + closing ---
19
+ const fmLines = parsed.matter.split('\n').length;
20
+ bodyStartLine = fmLines + 2; // +1 for opening ---, +1 for closing ---
21
+ }
22
+ return ok({
23
+ frontmatter,
24
+ body: parsed.content,
25
+ bodyStartLine,
26
+ });
27
+ }
28
+ catch (e) {
29
+ const message = e instanceof Error ? e.message : 'Unknown parse error';
30
+ return singleErr('PARSE_ERROR', `Failed to parse frontmatter: ${message}`, { file: filePath, line: 1, col: 1 });
31
+ }
32
+ }
33
+ //# sourceMappingURL=frontmatter.js.map