@mquan/mochi 0.1.0

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 (414) hide show
  1. package/README.md +154 -0
  2. package/dist/bin/mochi.d.ts +3 -0
  3. package/dist/bin/mochi.d.ts.map +1 -0
  4. package/dist/bin/mochi.js +74 -0
  5. package/dist/bin/mochi.js.map +1 -0
  6. package/dist/bin/tsconfig.tsbuildinfo +1 -0
  7. package/dist/server/analysis/git-context.d.ts +12 -0
  8. package/dist/server/analysis/git-context.d.ts.map +1 -0
  9. package/dist/server/analysis/git-context.js +151 -0
  10. package/dist/server/analysis/git-context.js.map +1 -0
  11. package/dist/server/analysis/grammars.d.ts +3 -0
  12. package/dist/server/analysis/grammars.d.ts.map +1 -0
  13. package/dist/server/analysis/grammars.js +32 -0
  14. package/dist/server/analysis/grammars.js.map +1 -0
  15. package/dist/server/analysis/index.d.ts +8 -0
  16. package/dist/server/analysis/index.d.ts.map +1 -0
  17. package/dist/server/analysis/index.js +86 -0
  18. package/dist/server/analysis/index.js.map +1 -0
  19. package/dist/server/analysis/tree-sitter.d.ts +20 -0
  20. package/dist/server/analysis/tree-sitter.d.ts.map +1 -0
  21. package/dist/server/analysis/tree-sitter.js +126 -0
  22. package/dist/server/analysis/tree-sitter.js.map +1 -0
  23. package/dist/server/analysis/ts-morph.d.ts +17 -0
  24. package/dist/server/analysis/ts-morph.d.ts.map +1 -0
  25. package/dist/server/analysis/ts-morph.js +143 -0
  26. package/dist/server/analysis/ts-morph.js.map +1 -0
  27. package/dist/server/analysis/types.d.ts +7 -0
  28. package/dist/server/analysis/types.d.ts.map +1 -0
  29. package/dist/server/analysis/types.js +9 -0
  30. package/dist/server/analysis/types.js.map +1 -0
  31. package/dist/server/api.d.ts +14 -0
  32. package/dist/server/api.d.ts.map +1 -0
  33. package/dist/server/api.js +121 -0
  34. package/dist/server/api.js.map +1 -0
  35. package/dist/server/diagram/cache.d.ts +23 -0
  36. package/dist/server/diagram/cache.d.ts.map +1 -0
  37. package/dist/server/diagram/cache.js +158 -0
  38. package/dist/server/diagram/cache.js.map +1 -0
  39. package/dist/server/diagram/endpoint.d.ts +21 -0
  40. package/dist/server/diagram/endpoint.d.ts.map +1 -0
  41. package/dist/server/diagram/endpoint.js +426 -0
  42. package/dist/server/diagram/endpoint.js.map +1 -0
  43. package/dist/server/diagram/generate.d.ts +220 -0
  44. package/dist/server/diagram/generate.d.ts.map +1 -0
  45. package/dist/server/diagram/generate.js +605 -0
  46. package/dist/server/diagram/generate.js.map +1 -0
  47. package/dist/server/diagram/prompt-version.d.ts +2 -0
  48. package/dist/server/diagram/prompt-version.d.ts.map +1 -0
  49. package/dist/server/diagram/prompt-version.js +47 -0
  50. package/dist/server/diagram/prompt-version.js.map +1 -0
  51. package/dist/server/diagram/prompts/diagram-spec.md +315 -0
  52. package/dist/server/diagram/scope-resolver.d.ts +44 -0
  53. package/dist/server/diagram/scope-resolver.d.ts.map +1 -0
  54. package/dist/server/diagram/scope-resolver.js +198 -0
  55. package/dist/server/diagram/scope-resolver.js.map +1 -0
  56. package/dist/server/diagram/spawn.d.ts +18 -0
  57. package/dist/server/diagram/spawn.d.ts.map +1 -0
  58. package/dist/server/diagram/spawn.js +103 -0
  59. package/dist/server/diagram/spawn.js.map +1 -0
  60. package/dist/server/index.d.ts +2 -0
  61. package/dist/server/index.d.ts.map +1 -0
  62. package/dist/server/index.js +2 -0
  63. package/dist/server/index.js.map +1 -0
  64. package/dist/server/input/path-selector.d.ts +8 -0
  65. package/dist/server/input/path-selector.d.ts.map +1 -0
  66. package/dist/server/input/path-selector.js +45 -0
  67. package/dist/server/input/path-selector.js.map +1 -0
  68. package/dist/server/server.d.ts +14 -0
  69. package/dist/server/server.d.ts.map +1 -0
  70. package/dist/server/server.js +79 -0
  71. package/dist/server/server.js.map +1 -0
  72. package/dist/server/tsconfig.tsbuildinfo +1 -0
  73. package/dist/shared/analysis-schema.d.ts +120 -0
  74. package/dist/shared/analysis-schema.d.ts.map +1 -0
  75. package/dist/shared/analysis-schema.js +43 -0
  76. package/dist/shared/analysis-schema.js.map +1 -0
  77. package/dist/shared/design/index.d.ts +6 -0
  78. package/dist/shared/design/index.d.ts.map +1 -0
  79. package/dist/shared/design/index.js +7 -0
  80. package/dist/shared/design/index.js.map +1 -0
  81. package/dist/shared/design/kinds.d.ts +26 -0
  82. package/dist/shared/design/kinds.d.ts.map +1 -0
  83. package/dist/shared/design/kinds.js +141 -0
  84. package/dist/shared/design/kinds.js.map +1 -0
  85. package/dist/shared/design/lenses.d.ts +11 -0
  86. package/dist/shared/design/lenses.d.ts.map +1 -0
  87. package/dist/shared/design/lenses.js +36 -0
  88. package/dist/shared/design/lenses.js.map +1 -0
  89. package/dist/shared/design/node-styles.d.ts +24 -0
  90. package/dist/shared/design/node-styles.d.ts.map +1 -0
  91. package/dist/shared/design/node-styles.js +150 -0
  92. package/dist/shared/design/node-styles.js.map +1 -0
  93. package/dist/shared/design/prompt-fragments.d.ts +4 -0
  94. package/dist/shared/design/prompt-fragments.d.ts.map +1 -0
  95. package/dist/shared/design/prompt-fragments.js +45 -0
  96. package/dist/shared/design/prompt-fragments.js.map +1 -0
  97. package/dist/shared/design/tokens.d.ts +102 -0
  98. package/dist/shared/design/tokens.d.ts.map +1 -0
  99. package/dist/shared/design/tokens.js +110 -0
  100. package/dist/shared/design/tokens.js.map +1 -0
  101. package/dist/shared/diagram-spec.d.ts +914 -0
  102. package/dist/shared/diagram-spec.d.ts.map +1 -0
  103. package/dist/shared/diagram-spec.js +173 -0
  104. package/dist/shared/diagram-spec.js.map +1 -0
  105. package/dist/shared/index.d.ts +2 -0
  106. package/dist/shared/index.d.ts.map +1 -0
  107. package/dist/shared/index.js +2 -0
  108. package/dist/shared/index.js.map +1 -0
  109. package/dist/shared/tsconfig.tsbuildinfo +1 -0
  110. package/dist/web/assets/abap-BdImnpbu.js +1 -0
  111. package/dist/web/assets/actionscript-3-CoDkCxhg.js +1 -0
  112. package/dist/web/assets/ada-bCR0ucgS.js +1 -0
  113. package/dist/web/assets/andromeeda-C4gqWexZ.js +1 -0
  114. package/dist/web/assets/angular-html-DMxchsRu.js +1 -0
  115. package/dist/web/assets/angular-ts-DzOHUlBM.js +1 -0
  116. package/dist/web/assets/apache-Pmp26Uib.js +1 -0
  117. package/dist/web/assets/apex-D8_7TLub.js +1 -0
  118. package/dist/web/assets/apl-dKokRX4l.js +1 -0
  119. package/dist/web/assets/applescript-Co6uUVPk.js +1 -0
  120. package/dist/web/assets/ara-BRHolxvo.js +1 -0
  121. package/dist/web/assets/asciidoc-Ve4PFQV2.js +1 -0
  122. package/dist/web/assets/asm-D_Q5rh1f.js +1 -0
  123. package/dist/web/assets/astro-CbQHKStN.js +1 -0
  124. package/dist/web/assets/aurora-x-D-2ljcwZ.js +1 -0
  125. package/dist/web/assets/awk-DMzUqQB5.js +1 -0
  126. package/dist/web/assets/ayu-dark-DYE7WIF3.js +1 -0
  127. package/dist/web/assets/ayu-light-BA47KaF1.js +1 -0
  128. package/dist/web/assets/ayu-mirage-32ctXXKs.js +1 -0
  129. package/dist/web/assets/ballerina-BFfxhgS-.js +1 -0
  130. package/dist/web/assets/bat-BkioyH1T.js +1 -0
  131. package/dist/web/assets/beancount-k_qm7-4y.js +1 -0
  132. package/dist/web/assets/berry-uYugtg8r.js +1 -0
  133. package/dist/web/assets/bibtex-CHM0blh-.js +1 -0
  134. package/dist/web/assets/bicep-Bmn6On1c.js +1 -0
  135. package/dist/web/assets/bird2-DPOp833l.js +1 -0
  136. package/dist/web/assets/blade-D4QpJJKB.js +1 -0
  137. package/dist/web/assets/bsl-BO_Y6i37.js +1 -0
  138. package/dist/web/assets/c-BIGW1oBm.js +1 -0
  139. package/dist/web/assets/c3-eo99z4R2.js +1 -0
  140. package/dist/web/assets/cadence-Bv_4Rxtq.js +1 -0
  141. package/dist/web/assets/cairo-KRGpt6FW.js +1 -0
  142. package/dist/web/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  143. package/dist/web/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  144. package/dist/web/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  145. package/dist/web/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  146. package/dist/web/assets/clarity-D53aC0YG.js +1 -0
  147. package/dist/web/assets/clojure-P80f7IUj.js +1 -0
  148. package/dist/web/assets/cmake-D1j8_8rp.js +1 -0
  149. package/dist/web/assets/cobol-nwyudZeR.js +1 -0
  150. package/dist/web/assets/codeowners-Bp6g37R7.js +1 -0
  151. package/dist/web/assets/codeql-DsOJ9woJ.js +1 -0
  152. package/dist/web/assets/coffee-Ch7k5sss.js +1 -0
  153. package/dist/web/assets/common-lisp-Cg-RD9OK.js +1 -0
  154. package/dist/web/assets/coq-DkFqJrB1.js +1 -0
  155. package/dist/web/assets/cpp-CofmeUqb.js +1 -0
  156. package/dist/web/assets/crystal-tKQVLTB8.js +1 -0
  157. package/dist/web/assets/csharp-COcwbKMJ.js +1 -0
  158. package/dist/web/assets/css-DPfMkruS.js +1 -0
  159. package/dist/web/assets/csv-fuZLfV_i.js +1 -0
  160. package/dist/web/assets/cue-D82EKSYY.js +1 -0
  161. package/dist/web/assets/cypher-COkxafJQ.js +1 -0
  162. package/dist/web/assets/d-85-TOEBH.js +1 -0
  163. package/dist/web/assets/dark-plus-C3mMm8J8.js +1 -0
  164. package/dist/web/assets/dart-CF10PKvl.js +1 -0
  165. package/dist/web/assets/dax-CEL-wOlO.js +1 -0
  166. package/dist/web/assets/desktop-BmXAJ9_W.js +1 -0
  167. package/dist/web/assets/diff-D97Zzqfu.js +1 -0
  168. package/dist/web/assets/docker-BcOcwvcX.js +1 -0
  169. package/dist/web/assets/dotenv-Da5cRb03.js +1 -0
  170. package/dist/web/assets/dracula-BzJJZx-M.js +1 -0
  171. package/dist/web/assets/dracula-soft-BXkSAIEj.js +1 -0
  172. package/dist/web/assets/dream-maker-BtqSS_iP.js +1 -0
  173. package/dist/web/assets/edge-BkV0erSs.js +1 -0
  174. package/dist/web/assets/elixir-CDX3lj18.js +1 -0
  175. package/dist/web/assets/elm-DbKCFpqz.js +1 -0
  176. package/dist/web/assets/emacs-lisp-C9XAeP06.js +1 -0
  177. package/dist/web/assets/erb-B12qg9BL.js +1 -0
  178. package/dist/web/assets/erlang-DsQrWhSR.js +1 -0
  179. package/dist/web/assets/everforest-dark-BgDCqdQA.js +1 -0
  180. package/dist/web/assets/everforest-light-C8M2exoo.js +1 -0
  181. package/dist/web/assets/fennel-BYunw83y.js +1 -0
  182. package/dist/web/assets/fish-BvzEVeQv.js +1 -0
  183. package/dist/web/assets/fluent-C4IJs8-o.js +1 -0
  184. package/dist/web/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  185. package/dist/web/assets/fortran-free-form-BxgE0vQu.js +1 -0
  186. package/dist/web/assets/fsharp-CXgrBDvD.js +1 -0
  187. package/dist/web/assets/gdresource-BOOCDP_w.js +1 -0
  188. package/dist/web/assets/gdscript-C5YyOfLZ.js +1 -0
  189. package/dist/web/assets/gdshader-DkwncUOv.js +1 -0
  190. package/dist/web/assets/genie-D0YGMca9.js +1 -0
  191. package/dist/web/assets/gherkin-DyxjwDmM.js +1 -0
  192. package/dist/web/assets/git-commit-F4YmCXRG.js +1 -0
  193. package/dist/web/assets/git-rebase-r7XF79zn.js +1 -0
  194. package/dist/web/assets/github-dark-DHJKELXO.js +1 -0
  195. package/dist/web/assets/github-dark-default-Cuk6v7N8.js +1 -0
  196. package/dist/web/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  197. package/dist/web/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  198. package/dist/web/assets/github-light-DAi9KRSo.js +1 -0
  199. package/dist/web/assets/github-light-default-D7oLnXFd.js +1 -0
  200. package/dist/web/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  201. package/dist/web/assets/gleam-BspZqrRM.js +1 -0
  202. package/dist/web/assets/glimmer-js-Rg0-pVw9.js +1 -0
  203. package/dist/web/assets/glimmer-ts-U6CK756n.js +1 -0
  204. package/dist/web/assets/glsl-DplSGwfg.js +1 -0
  205. package/dist/web/assets/gn-n2N0HUVH.js +1 -0
  206. package/dist/web/assets/gnuplot-DdkO51Og.js +1 -0
  207. package/dist/web/assets/go-CxLEBnE3.js +1 -0
  208. package/dist/web/assets/graphql-ChdNCCLP.js +1 -0
  209. package/dist/web/assets/groovy-gcz8RCvz.js +1 -0
  210. package/dist/web/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  211. package/dist/web/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  212. package/dist/web/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  213. package/dist/web/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  214. package/dist/web/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  215. package/dist/web/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  216. package/dist/web/assets/hack-CaT9iCJl.js +1 -0
  217. package/dist/web/assets/haml-B8DHNrY2.js +1 -0
  218. package/dist/web/assets/handlebars-BL8al0AC.js +1 -0
  219. package/dist/web/assets/haskell-Df6bDoY_.js +1 -0
  220. package/dist/web/assets/haxe-CzTSHFRz.js +1 -0
  221. package/dist/web/assets/hcl-BWvSN4gD.js +1 -0
  222. package/dist/web/assets/hjson-D5-asLiD.js +1 -0
  223. package/dist/web/assets/hlsl-D3lLCCz7.js +1 -0
  224. package/dist/web/assets/horizon-BUw7H-hv.js +1 -0
  225. package/dist/web/assets/horizon-bright-Cn-bp-IR.js +1 -0
  226. package/dist/web/assets/houston-DnULxvSX.js +1 -0
  227. package/dist/web/assets/html-GMplVEZG.js +1 -0
  228. package/dist/web/assets/html-derivative-BFtXZ54Q.js +1 -0
  229. package/dist/web/assets/http-jrhK8wxY.js +1 -0
  230. package/dist/web/assets/hurl-irOxFIW8.js +1 -0
  231. package/dist/web/assets/hxml-Bvhsp5Yf.js +1 -0
  232. package/dist/web/assets/hy-DFXneXwc.js +1 -0
  233. package/dist/web/assets/imba-DGztddWO.js +1 -0
  234. package/dist/web/assets/index-B4-Q-CcM.js +88 -0
  235. package/dist/web/assets/index-DtQV41FL.css +1 -0
  236. package/dist/web/assets/ini-BEwlwnbL.js +1 -0
  237. package/dist/web/assets/java-CylS5w8V.js +1 -0
  238. package/dist/web/assets/javascript-wDzz0qaB.js +1 -0
  239. package/dist/web/assets/jinja-4LBKfQ-Z.js +1 -0
  240. package/dist/web/assets/jison-wvAkD_A8.js +1 -0
  241. package/dist/web/assets/json-Cp-IABpG.js +1 -0
  242. package/dist/web/assets/json5-C9tS-k6U.js +1 -0
  243. package/dist/web/assets/jsonc-Des-eS-w.js +1 -0
  244. package/dist/web/assets/jsonl-DcaNXYhu.js +1 -0
  245. package/dist/web/assets/jsonnet-DFQXde-d.js +1 -0
  246. package/dist/web/assets/jssm-C2t-YnRu.js +1 -0
  247. package/dist/web/assets/jsx-g9-lgVsj.js +1 -0
  248. package/dist/web/assets/julia-CxzCAyBv.js +1 -0
  249. package/dist/web/assets/just-Cw27pwNe.js +1 -0
  250. package/dist/web/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  251. package/dist/web/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  252. package/dist/web/assets/kanagawa-wave-DWedfzmr.js +1 -0
  253. package/dist/web/assets/kdl-DV7GczEv.js +1 -0
  254. package/dist/web/assets/kotlin-BdnUsdx6.js +1 -0
  255. package/dist/web/assets/kusto-DZf3V79B.js +1 -0
  256. package/dist/web/assets/laserwave-DUszq2jm.js +1 -0
  257. package/dist/web/assets/latex-CWtU0Tv5.js +1 -0
  258. package/dist/web/assets/lean-BZvkOJ9d.js +1 -0
  259. package/dist/web/assets/less-B1dDrJ26.js +1 -0
  260. package/dist/web/assets/light-plus-B7mTdjB0.js +1 -0
  261. package/dist/web/assets/liquid-DYVedYrR.js +1 -0
  262. package/dist/web/assets/llvm-DjAJT7YJ.js +1 -0
  263. package/dist/web/assets/log-2UxHyX5q.js +1 -0
  264. package/dist/web/assets/logo-BtOb2qkB.js +1 -0
  265. package/dist/web/assets/lua-BaeVxFsk.js +1 -0
  266. package/dist/web/assets/luau-C-HG3fhB.js +1 -0
  267. package/dist/web/assets/make-CHLpvVh8.js +1 -0
  268. package/dist/web/assets/markdown-Cvjx9yec.js +1 -0
  269. package/dist/web/assets/marko-CnJfTvn9.js +1 -0
  270. package/dist/web/assets/material-theme-D5KoaKCx.js +1 -0
  271. package/dist/web/assets/material-theme-darker-BfHTSMKl.js +1 -0
  272. package/dist/web/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  273. package/dist/web/assets/material-theme-ocean-CyktbL80.js +1 -0
  274. package/dist/web/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  275. package/dist/web/assets/matlab-D7o27uSR.js +1 -0
  276. package/dist/web/assets/mdc-BMNejdWA.js +1 -0
  277. package/dist/web/assets/mdx-Cmh6b_Ma.js +1 -0
  278. package/dist/web/assets/mermaid-mWjccvbQ.js +1 -0
  279. package/dist/web/assets/min-dark-CafNBF8u.js +1 -0
  280. package/dist/web/assets/min-light-CTRr51gU.js +1 -0
  281. package/dist/web/assets/mipsasm-CKIfxQSi.js +1 -0
  282. package/dist/web/assets/mojo-rZm6bMo-.js +1 -0
  283. package/dist/web/assets/monokai-D4h5O-jR.js +1 -0
  284. package/dist/web/assets/moonbit-_H4v1dQx.js +1 -0
  285. package/dist/web/assets/move-IF9eRakj.js +1 -0
  286. package/dist/web/assets/narrat-DRg8JJMk.js +1 -0
  287. package/dist/web/assets/nextflow-Zz6hmt5N.js +1 -0
  288. package/dist/web/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  289. package/dist/web/assets/nginx-BpAMiNFr.js +1 -0
  290. package/dist/web/assets/night-owl-C39BiMTA.js +1 -0
  291. package/dist/web/assets/night-owl-light-CMTm3GFP.js +1 -0
  292. package/dist/web/assets/nim-CVrawwO9.js +1 -0
  293. package/dist/web/assets/nix-CwoSXNpI.js +1 -0
  294. package/dist/web/assets/nord-Ddv68eIx.js +1 -0
  295. package/dist/web/assets/nushell-Cz2AlsmD.js +1 -0
  296. package/dist/web/assets/objective-c-DXmwc3jG.js +1 -0
  297. package/dist/web/assets/objective-cpp-CLxacb5B.js +1 -0
  298. package/dist/web/assets/ocaml-C0hk2d4L.js +1 -0
  299. package/dist/web/assets/odin-BBf5iR-q.js +1 -0
  300. package/dist/web/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  301. package/dist/web/assets/one-light-C3Wv6jpd.js +1 -0
  302. package/dist/web/assets/openscad-C4EeE6gA.js +1 -0
  303. package/dist/web/assets/pascal-D93ZcfNL.js +1 -0
  304. package/dist/web/assets/perl-C0TMdlhV.js +1 -0
  305. package/dist/web/assets/php-Dhbhpdrm.js +1 -0
  306. package/dist/web/assets/pkl-u5AG7uiY.js +1 -0
  307. package/dist/web/assets/plastic-3e1v2bzS.js +1 -0
  308. package/dist/web/assets/plsql-ChMvpjG-.js +1 -0
  309. package/dist/web/assets/po-BTJTHyun.js +1 -0
  310. package/dist/web/assets/poimandres-CS3Unz2-.js +1 -0
  311. package/dist/web/assets/polar-C0HS_06l.js +1 -0
  312. package/dist/web/assets/postcss-CXtECtnM.js +1 -0
  313. package/dist/web/assets/powerquery-CEu0bR-o.js +1 -0
  314. package/dist/web/assets/powershell-Dpen1YoG.js +1 -0
  315. package/dist/web/assets/prisma-Dd19v3D-.js +1 -0
  316. package/dist/web/assets/prolog-CbFg5uaA.js +1 -0
  317. package/dist/web/assets/proto-C7zT0LnQ.js +1 -0
  318. package/dist/web/assets/pug-CGlum2m_.js +1 -0
  319. package/dist/web/assets/puppet-BMWR74SV.js +1 -0
  320. package/dist/web/assets/purescript-CklMAg4u.js +1 -0
  321. package/dist/web/assets/python-B6aJPvgy.js +1 -0
  322. package/dist/web/assets/qml-3beO22l8.js +1 -0
  323. package/dist/web/assets/qmldir-C8lEn-DE.js +1 -0
  324. package/dist/web/assets/qss-IeuSbFQv.js +1 -0
  325. package/dist/web/assets/r-Dspwwk_N.js +1 -0
  326. package/dist/web/assets/racket-BqYA7rlc.js +1 -0
  327. package/dist/web/assets/raku-DXvB9xmW.js +1 -0
  328. package/dist/web/assets/razor-Uh8Bk_45.js +1 -0
  329. package/dist/web/assets/red-bN70gL4F.js +1 -0
  330. package/dist/web/assets/reg-C-SQnVFl.js +1 -0
  331. package/dist/web/assets/regexp-CDVJQ6XC.js +1 -0
  332. package/dist/web/assets/rel-C3B-1QV4.js +1 -0
  333. package/dist/web/assets/riscv-BM1_JUlF.js +1 -0
  334. package/dist/web/assets/ron-D8l8udqQ.js +1 -0
  335. package/dist/web/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  336. package/dist/web/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  337. package/dist/web/assets/rose-pine-qdsjHGoJ.js +1 -0
  338. package/dist/web/assets/rosmsg-BJDFO7_C.js +1 -0
  339. package/dist/web/assets/rst-BrH8l1NY.js +1 -0
  340. package/dist/web/assets/ruby-Dw2BHqvy.js +1 -0
  341. package/dist/web/assets/rust-B1yitclQ.js +1 -0
  342. package/dist/web/assets/sas-cz2c8ADy.js +1 -0
  343. package/dist/web/assets/sass-Cj5Yp3dK.js +1 -0
  344. package/dist/web/assets/scala-C151Ov-r.js +1 -0
  345. package/dist/web/assets/scheme-C98Dy4si.js +1 -0
  346. package/dist/web/assets/scss-OYdSNvt2.js +1 -0
  347. package/dist/web/assets/sdbl-DVxCFoDh.js +1 -0
  348. package/dist/web/assets/shaderlab-Dg9Lc6iA.js +1 -0
  349. package/dist/web/assets/shellscript-Yzrsuije.js +1 -0
  350. package/dist/web/assets/shellsession-BADoaaVG.js +1 -0
  351. package/dist/web/assets/slack-dark-BthQWCQV.js +1 -0
  352. package/dist/web/assets/slack-ochin-DqwNpetd.js +1 -0
  353. package/dist/web/assets/smalltalk-BERRCDM3.js +1 -0
  354. package/dist/web/assets/snazzy-light-Bw305WKR.js +1 -0
  355. package/dist/web/assets/solarized-dark-DXbdFlpD.js +1 -0
  356. package/dist/web/assets/solarized-light-L9t79GZl.js +1 -0
  357. package/dist/web/assets/solidity-rGO070M0.js +1 -0
  358. package/dist/web/assets/soy-Brmx7dQM.js +1 -0
  359. package/dist/web/assets/sparql-rVzFXLq3.js +1 -0
  360. package/dist/web/assets/splunk-BtCnVYZw.js +1 -0
  361. package/dist/web/assets/sql-BLtJtn59.js +1 -0
  362. package/dist/web/assets/ssh-config-_ykCGR6B.js +1 -0
  363. package/dist/web/assets/stata-BH5u7GGu.js +1 -0
  364. package/dist/web/assets/stylus-BEDo0Tqx.js +1 -0
  365. package/dist/web/assets/surrealql-Bq5Q-fJD.js +1 -0
  366. package/dist/web/assets/svelte-C_ipcX3V.js +1 -0
  367. package/dist/web/assets/swift-D82vCrfD.js +1 -0
  368. package/dist/web/assets/synthwave-84-CbfX1IO0.js +1 -0
  369. package/dist/web/assets/system-verilog-CnnmHF94.js +1 -0
  370. package/dist/web/assets/systemd-4A_iFExJ.js +1 -0
  371. package/dist/web/assets/talonscript-CkByrt1z.js +1 -0
  372. package/dist/web/assets/tasl-QIJgUcNo.js +1 -0
  373. package/dist/web/assets/tcl-dwOrl1Do.js +1 -0
  374. package/dist/web/assets/templ-P3uqSqPl.js +1 -0
  375. package/dist/web/assets/terraform-BETggiCN.js +1 -0
  376. package/dist/web/assets/tex-idrVyKtj.js +1 -0
  377. package/dist/web/assets/tokyo-night-hegEt444.js +1 -0
  378. package/dist/web/assets/toml-vGWfd6FD.js +1 -0
  379. package/dist/web/assets/ts-tags-zn1MmPIZ.js +1 -0
  380. package/dist/web/assets/tsv-B_m7g4N7.js +1 -0
  381. package/dist/web/assets/tsx-COt5Ahok.js +1 -0
  382. package/dist/web/assets/turtle-BsS91CYL.js +1 -0
  383. package/dist/web/assets/twig-DNn4PbVi.js +1 -0
  384. package/dist/web/assets/typescript-BPQ3VLAy.js +1 -0
  385. package/dist/web/assets/typespec-BGHnOYBU.js +1 -0
  386. package/dist/web/assets/typst-DHCkPAjA.js +1 -0
  387. package/dist/web/assets/v-BcVCzyr7.js +1 -0
  388. package/dist/web/assets/vala-CsfeWuGM.js +1 -0
  389. package/dist/web/assets/vb-D17OF-Vu.js +1 -0
  390. package/dist/web/assets/verilog-BQ8w6xss.js +1 -0
  391. package/dist/web/assets/vesper-DU1UobuO.js +1 -0
  392. package/dist/web/assets/vhdl-CeAyd5Ju.js +1 -0
  393. package/dist/web/assets/viml-CJc9bBzg.js +1 -0
  394. package/dist/web/assets/vitesse-black-Bkuqu6BP.js +1 -0
  395. package/dist/web/assets/vitesse-dark-D0r3Knsf.js +1 -0
  396. package/dist/web/assets/vitesse-light-CVO1_9PV.js +1 -0
  397. package/dist/web/assets/vue-DN_0RTcg.js +1 -0
  398. package/dist/web/assets/vue-html-AaS7Mt5G.js +1 -0
  399. package/dist/web/assets/vue-vine-CQOfvN7w.js +1 -0
  400. package/dist/web/assets/vyper-CDx5xZoG.js +1 -0
  401. package/dist/web/assets/wasm-CG6Dc4jp.js +1 -0
  402. package/dist/web/assets/wasm-MzD3tlZU.js +1 -0
  403. package/dist/web/assets/wenyan-BV7otONQ.js +1 -0
  404. package/dist/web/assets/wgsl-Dx-B1_4e.js +1 -0
  405. package/dist/web/assets/wikitext-BhOHFoWU.js +1 -0
  406. package/dist/web/assets/wit-5i3qLPDT.js +1 -0
  407. package/dist/web/assets/wolfram-lXgVvXCa.js +1 -0
  408. package/dist/web/assets/xml-sdJ4AIDG.js +1 -0
  409. package/dist/web/assets/xsl-CtQFsRM5.js +1 -0
  410. package/dist/web/assets/yaml-Buea-lGh.js +1 -0
  411. package/dist/web/assets/zenscript-DVFEvuxE.js +1 -0
  412. package/dist/web/assets/zig-VOosw3JB.js +1 -0
  413. package/dist/web/index.html +13 -0
  414. package/package.json +56 -0
@@ -0,0 +1,86 @@
1
+ // Orchestrator for the static-analysis layer.
2
+ //
3
+ // Runs the three analyzers in parallel and assembles the result into the
4
+ // `AnalysisContext` defined in `shared/analysis-schema.ts`. Each analyzer is
5
+ // isolated via Promise.allSettled — a thrown failure in one module degrades
6
+ // that slice (and possibly the depth tier) but never aborts the whole
7
+ // analysis.
8
+ //
9
+ // `runAnalysis` itself only throws on schema drift (the final zod parse),
10
+ // which is a programmer error — surfaces during dev rather than producing a
11
+ // half-formed payload that would confuse the diagram generator.
12
+ //
13
+ // Note: mochi m1 omits the dependency-cruiser pass that exists in miso. The
14
+ // `depGraph` field in AnalysisContext remains optional so a future task can
15
+ // re-introduce it without a schema bump.
16
+ import { AnalysisContext } from "../../shared/analysis-schema.js";
17
+ import { getGitContext } from "./git-context.js";
18
+ import { analyzeTsMorph } from "./ts-morph.js";
19
+ import { analyzeWithTreeSitter } from "./tree-sitter.js";
20
+ function summariseSkips(summaries) {
21
+ let parsed = 0;
22
+ let tooLarge = 0;
23
+ let unsupported = 0;
24
+ let parseError = 0;
25
+ for (const s of summaries) {
26
+ if (s.parsed) {
27
+ parsed++;
28
+ }
29
+ else if (s.skipReason === "too-large") {
30
+ tooLarge++;
31
+ }
32
+ else if (s.skipReason === "unsupported-language") {
33
+ unsupported++;
34
+ }
35
+ else if (s.skipReason === "parse-error") {
36
+ parseError++;
37
+ }
38
+ }
39
+ return { parsed, tooLarge, unsupported, parseError };
40
+ }
41
+ export async function runAnalysis(files, rootDir) {
42
+ const filePaths = files.map((f) => f.path);
43
+ const [tsResult, tsMorphResult, gitResult] = await Promise.allSettled([
44
+ analyzeWithTreeSitter(files),
45
+ Promise.resolve().then(() => analyzeTsMorph(files, rootDir)),
46
+ getGitContext(rootDir, filePaths),
47
+ ]);
48
+ const astSummaries = tsResult.status === "fulfilled" ? tsResult.value.astSummaries : [];
49
+ if (tsResult.status === "rejected") {
50
+ console.warn(`mochi: tree-sitter pass rejected — ${String(tsResult.reason)}`);
51
+ }
52
+ let tsContext = null;
53
+ if (tsMorphResult.status === "fulfilled") {
54
+ tsContext = tsMorphResult.value;
55
+ }
56
+ else {
57
+ console.warn(`mochi: ts-morph pass rejected — ${String(tsMorphResult.reason)}`);
58
+ }
59
+ let git;
60
+ if (gitResult.status === "fulfilled") {
61
+ git = gitResult.value;
62
+ }
63
+ else {
64
+ console.warn(`mochi: git pass rejected — ${String(gitResult.reason)}`);
65
+ git = { recentCommits: [] };
66
+ }
67
+ const depthTier = tsContext !== null ? "deep" : "structural";
68
+ const counts = summariseSkips(astSummaries);
69
+ const tsCount = tsContext
70
+ ? `${tsContext.imports.length} imports / ${tsContext.callHierarchy.length} call edges`
71
+ : "none";
72
+ console.info(`mochi: analyzed ${files.length} files (parsed=${counts.parsed}, skipped: too-large=${counts.tooLarge}, unsupported=${counts.unsupported}, parse-error=${counts.parseError}; ts-morph: ${tsCount}; git: ${git.recentCommits.length} commits; depthTier=${depthTier})`);
73
+ const result = {
74
+ files,
75
+ git,
76
+ depthTier,
77
+ };
78
+ if (tsContext !== null) {
79
+ result.tsContext = {
80
+ callHierarchy: tsContext.callHierarchy,
81
+ imports: tsContext.imports,
82
+ };
83
+ }
84
+ return AnalysisContext.parse(result);
85
+ }
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/analysis/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { FileEntry } from "./types.js";
2
+ export type AstSummary = {
3
+ path: string;
4
+ parsed: true;
5
+ language: string;
6
+ nodeCount: number;
7
+ } | {
8
+ path: string;
9
+ parsed: false;
10
+ language: string;
11
+ skipReason: "too-large" | "unsupported-language" | "parse-error";
12
+ error?: string;
13
+ };
14
+ export declare function analyzeWithTreeSitter(files: FileEntry[]): Promise<{
15
+ astSummaries: AstSummary[];
16
+ }>;
17
+ export declare const __testing__: {
18
+ resetCaches(): void;
19
+ };
20
+ //# sourceMappingURL=tree-sitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-sitter.d.ts","sourceRoot":"","sources":["../../../server/analysis/tree-sitter.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnE;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,WAAW,GAAG,sBAAsB,GAAG,aAAa,CAAC;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsCN,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,YAAY,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CAgEzC;AAED,eAAO,MAAM,WAAW;mBACP,IAAI;CAIpB,CAAC"}
@@ -0,0 +1,126 @@
1
+ // Tree-sitter wrapper.
2
+ //
3
+ // Produces an AST summary per file: `{ parsed, language, nodeCount? | skipReason }`.
4
+ // astSummaries are NOT propagated into AnalysisContext (the wire schema doesn't
5
+ // carry them); they exist so the orchestrator can emit a one-line summary log
6
+ // of how many files parsed/skipped/erred.
7
+ //
8
+ // All failure modes are turned into structured skip records — this function
9
+ // never throws. Per-file try/catch handles tree-sitter's RangeError on huge
10
+ // inputs (the 500KB pre-filter is belt-and-suspenders for the same case).
11
+ //
12
+ // Init/grammar caching: a single Parser.init() promise is memoized at module
13
+ // scope; `loadGrammar` returns a per-language Promise (NOT a resolved Language)
14
+ // so concurrent first-loads dedupe to one in-flight Language.load.
15
+ import { readFile } from "node:fs/promises";
16
+ import { createRequire } from "node:module";
17
+ import { Language, Parser } from "web-tree-sitter";
18
+ import { MAX_FILE_BYTES } from "../input/path-selector.js";
19
+ import { LANGUAGE_GRAMMARS, isSupportedLanguage } from "./grammars.js";
20
+ const requireFromHere = createRequire(import.meta.url);
21
+ let parserInitPromise = null;
22
+ const grammarPromises = new Map();
23
+ async function ensureParserInit() {
24
+ if (parserInitPromise === null) {
25
+ parserInitPromise = (async () => {
26
+ // web-tree-sitter ships its runtime `tree-sitter.wasm` next to the JS
27
+ // entry. The default Emscripten loader looks for it relative to the
28
+ // script, which fails reliably in Node ESM (and in Vitest's SSR).
29
+ // Read it ourselves and pass via wasmBinary — same payload, no
30
+ // resolution dance at runtime.
31
+ const wasmFile = requireFromHere.resolve("web-tree-sitter/tree-sitter.wasm");
32
+ const wasmBinary = await readFile(wasmFile);
33
+ await Parser.init({ wasmBinary });
34
+ })();
35
+ }
36
+ return parserInitPromise;
37
+ }
38
+ function loadGrammar(language) {
39
+ const cached = grammarPromises.get(language);
40
+ if (cached)
41
+ return cached;
42
+ const resolver = LANGUAGE_GRAMMARS[language];
43
+ if (!resolver) {
44
+ return Promise.reject(new Error(`mochi: unsupported tree-sitter language: ${language}`));
45
+ }
46
+ const p = Language.load(resolver());
47
+ grammarPromises.set(language, p);
48
+ return p;
49
+ }
50
+ function logSkip(path, language, reason, extra) {
51
+ const tail = extra ? `; ${extra}` : "";
52
+ console.warn(`mochi: tree-sitter skipping ${path} (${reason}${tail}; language=${language})`);
53
+ }
54
+ export async function analyzeWithTreeSitter(files) {
55
+ await ensureParserInit();
56
+ const summaries = [];
57
+ for (const file of files) {
58
+ if (file.size > MAX_FILE_BYTES) {
59
+ logSkip(file.path, file.language, "too-large", `size=${file.size}`);
60
+ summaries.push({
61
+ path: file.path,
62
+ parsed: false,
63
+ language: file.language,
64
+ skipReason: "too-large",
65
+ });
66
+ continue;
67
+ }
68
+ if (!isSupportedLanguage(file.language)) {
69
+ summaries.push({
70
+ path: file.path,
71
+ parsed: false,
72
+ language: file.language,
73
+ skipReason: "unsupported-language",
74
+ });
75
+ continue;
76
+ }
77
+ try {
78
+ const grammar = await loadGrammar(file.language);
79
+ const parser = new Parser();
80
+ parser.setLanguage(grammar);
81
+ const tree = parser.parse(file.content);
82
+ try {
83
+ if (tree === null) {
84
+ summaries.push({
85
+ path: file.path,
86
+ parsed: false,
87
+ language: file.language,
88
+ skipReason: "parse-error",
89
+ error: "parser returned null",
90
+ });
91
+ }
92
+ else {
93
+ summaries.push({
94
+ path: file.path,
95
+ parsed: true,
96
+ language: file.language,
97
+ nodeCount: tree.rootNode.descendantCount,
98
+ });
99
+ }
100
+ }
101
+ finally {
102
+ tree?.delete();
103
+ parser.delete();
104
+ }
105
+ }
106
+ catch (err) {
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ logSkip(file.path, file.language, "parse-error", message);
109
+ summaries.push({
110
+ path: file.path,
111
+ parsed: false,
112
+ language: file.language,
113
+ skipReason: "parse-error",
114
+ error: message,
115
+ });
116
+ }
117
+ }
118
+ return { astSummaries: summaries };
119
+ }
120
+ export const __testing__ = {
121
+ resetCaches() {
122
+ parserInitPromise = null;
123
+ grammarPromises.clear();
124
+ },
125
+ };
126
+ //# sourceMappingURL=tree-sitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-sitter.js","sourceRoot":"","sources":["../../../server/analysis/tree-sitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FileEntry } from "./types.js";
2
+ export interface CallEdge {
3
+ fromFile: string;
4
+ fromFunction: string;
5
+ toName: string;
6
+ }
7
+ export interface ImportEntry {
8
+ fromFile: string;
9
+ specifier: string;
10
+ resolvedPath: string | null;
11
+ }
12
+ export interface TsMorphResult {
13
+ callHierarchy: CallEdge[];
14
+ imports: ImportEntry[];
15
+ }
16
+ export declare function analyzeTsMorph(files: FileEntry[], rootDir: string): TsMorphResult | null;
17
+ //# sourceMappingURL=ts-morph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-morph.d.ts","sourceRoot":"","sources":["../../../server/analysis/ts-morph.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAsDD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,EAAE,MAAM,GACd,aAAa,GAAG,IAAI,CAuEtB"}
@@ -0,0 +1,143 @@
1
+ // ts-morph wrapper.
2
+ //
3
+ // Builds a transient ts-morph Project from the in-memory file contents (we
4
+ // avoid loading the user's tsconfig — it could be slow, missing, or invalid,
5
+ // and it makes test setup unpredictable). Extracts two slices used by the
6
+ // diagram generator (m2):
7
+ // - imports: module-level import declarations, with resolved file
8
+ // paths (relative to rootDir) when the target is in scope.
9
+ // - callHierarchy: best-effort top-level call edges from exported functions.
10
+ // This is intentionally shallow — narration anchoring
11
+ // tolerates noise; symbol resolution is not in v1 scope.
12
+ //
13
+ // Returns `null` when the file set has zero TS/JS files. That null is the
14
+ // depth-tier downgrade signal the orchestrator uses to mark the analysis
15
+ // "structural" instead of "deep".
16
+ //
17
+ // Failure modes:
18
+ // - Project construction throws → outer try/catch returns `null`.
19
+ // - Per-file `createSourceFile` throws → log + skip that file, continue.
20
+ // Files larger than MAX_FILE_BYTES are filtered out before being passed to
21
+ // ts-morph (consistency with the tree-sitter guardrail).
22
+ import path from "node:path";
23
+ import { ModuleKind, ModuleResolutionKind, Project, ScriptTarget, SyntaxKind, } from "ts-morph";
24
+ import { MAX_FILE_BYTES } from "../input/path-selector.js";
25
+ const TS_JS_LANGS = new Set(["typescript", "tsx", "javascript", "jsx"]);
26
+ function isTsJsFile(file) {
27
+ return TS_JS_LANGS.has(file.language);
28
+ }
29
+ function relPath(absPath, rootDir) {
30
+ const r = path.relative(rootDir, absPath);
31
+ return r === "" ? path.basename(absPath) : r;
32
+ }
33
+ // Collapse the callee expression of a CallExpression to a single name.
34
+ // foo() → "foo"
35
+ // obj.method() → "method"
36
+ // pkg.sub.fn() → "fn"
37
+ // (x as T).fn() → null (skipped — non-identifier-rooted)
38
+ // arr[0]() → null (computed)
39
+ // foo()() → null (call result)
40
+ function calleeName(call) {
41
+ const expr = call.getExpression();
42
+ if (expr.getKind() === SyntaxKind.Identifier) {
43
+ return expr.getText();
44
+ }
45
+ if (expr.getKind() === SyntaxKind.PropertyAccessExpression) {
46
+ const prop = expr.asKindOrThrow(SyntaxKind.PropertyAccessExpression);
47
+ return prop.getName();
48
+ }
49
+ return null;
50
+ }
51
+ function collectExportedFunctions(source) {
52
+ const out = [];
53
+ for (const fn of source.getFunctions()) {
54
+ if (!fn.isExported())
55
+ continue;
56
+ const name = fn.getName();
57
+ if (name)
58
+ out.push({ name, node: fn });
59
+ }
60
+ for (const v of source.getVariableStatements()) {
61
+ if (!v.isExported())
62
+ continue;
63
+ for (const decl of v.getDeclarations()) {
64
+ const init = decl.getInitializer();
65
+ if (!init)
66
+ continue;
67
+ const k = init.getKind();
68
+ if (k === SyntaxKind.ArrowFunction || k === SyntaxKind.FunctionExpression) {
69
+ out.push({ name: decl.getName(), node: init });
70
+ }
71
+ }
72
+ }
73
+ return out;
74
+ }
75
+ export function analyzeTsMorph(files, rootDir) {
76
+ const candidates = files.filter((f) => {
77
+ if (!isTsJsFile(f))
78
+ return false;
79
+ if (f.size > MAX_FILE_BYTES) {
80
+ console.warn(`mochi: ts-morph skipping ${f.path} (too-large; size=${f.size})`);
81
+ return false;
82
+ }
83
+ return true;
84
+ });
85
+ if (candidates.length === 0)
86
+ return null;
87
+ let project;
88
+ try {
89
+ project = new Project({
90
+ useInMemoryFileSystem: false,
91
+ skipAddingFilesFromTsConfig: true,
92
+ compilerOptions: {
93
+ allowJs: true,
94
+ noEmit: true,
95
+ target: ScriptTarget.ES2022,
96
+ module: ModuleKind.ESNext,
97
+ moduleResolution: ModuleResolutionKind.NodeNext,
98
+ baseUrl: rootDir,
99
+ },
100
+ });
101
+ }
102
+ catch (err) {
103
+ const msg = err instanceof Error ? err.message : String(err);
104
+ console.warn(`mochi: ts-morph Project construction failed: ${msg}`);
105
+ return null;
106
+ }
107
+ const sourceFiles = [];
108
+ for (const file of candidates) {
109
+ const abs = path.isAbsolute(file.path) ? file.path : path.join(rootDir, file.path);
110
+ try {
111
+ const sf = project.createSourceFile(abs, file.content, { overwrite: true });
112
+ sourceFiles.push(sf);
113
+ }
114
+ catch (err) {
115
+ const msg = err instanceof Error ? err.message : String(err);
116
+ console.warn(`mochi: ts-morph skipping ${file.path} (createSourceFile: ${msg})`);
117
+ }
118
+ }
119
+ const imports = [];
120
+ const callHierarchy = [];
121
+ for (const source of sourceFiles) {
122
+ const fromFile = relPath(source.getFilePath(), rootDir);
123
+ for (const decl of source.getImportDeclarations()) {
124
+ const specifier = decl.getModuleSpecifierValue();
125
+ const resolved = decl.getModuleSpecifierSourceFile();
126
+ const resolvedPath = resolved
127
+ ? relPath(resolved.getFilePath(), rootDir)
128
+ : null;
129
+ imports.push({ fromFile, specifier, resolvedPath });
130
+ }
131
+ for (const { name, node } of collectExportedFunctions(source)) {
132
+ const calls = node.getDescendantsOfKind(SyntaxKind.CallExpression);
133
+ for (const call of calls) {
134
+ const toName = calleeName(call);
135
+ if (toName === null)
136
+ continue;
137
+ callHierarchy.push({ fromFile, fromFunction: name, toName });
138
+ }
139
+ }
140
+ }
141
+ return { callHierarchy, imports };
142
+ }
143
+ //# sourceMappingURL=ts-morph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-morph.js","sourceRoot":"","sources":["../../../server/analysis/ts-morph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface FileEntry {
2
+ path: string;
3
+ content: string;
4
+ language: string;
5
+ size: number;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../server/analysis/types.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,9 @@
1
+ // Shared internal types for the analysis layer. Kept in a leaf module so
2
+ // each analyzer can import without pulling in the orchestrator (which would
3
+ // create an import cycle).
4
+ //
5
+ // `FileEntry` mirrors the per-file element of `AnalysisContext.files` in
6
+ // `shared/analysis-schema.ts`. It is re-exported from `./index.ts` as the
7
+ // public API for peer tasks (m2 diagram-generate).
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/analysis/types.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,4EAA4E;AAC5E,2BAA2B;AAC3B,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,mDAAmD"}
@@ -0,0 +1,14 @@
1
+ import { Router, type RequestHandler } from "express";
2
+ export declare const EXT_TO_LANG: Record<string, string>;
3
+ export declare function languageFor(ext: string): string;
4
+ export declare function resolveContainedPath(realRoot: string, rel: string): Promise<string | null>;
5
+ export interface ApiRouterOptions {
6
+ root: string;
7
+ files: string[];
8
+ diagramHandler?: RequestHandler;
9
+ }
10
+ export interface ApiRouterHandle {
11
+ router: Router;
12
+ }
13
+ export declare function createApiRouter(opts: ApiRouterOptions): ApiRouterHandle;
14
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../server/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqB9C,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAMD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAiBD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,EAAE,CAAC;IAGhB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CA8EvE"}
@@ -0,0 +1,121 @@
1
+ import { Router, } from "express";
2
+ import { realpath, readFile, stat } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { MAX_FILE_BYTES } from "./input/path-selector.js";
5
+ export const EXT_TO_LANG = {
6
+ ".ts": "typescript",
7
+ ".tsx": "tsx",
8
+ ".js": "javascript",
9
+ ".mjs": "javascript",
10
+ ".cjs": "javascript",
11
+ ".jsx": "jsx",
12
+ ".py": "python",
13
+ ".go": "go",
14
+ ".rs": "rust",
15
+ ".java": "java",
16
+ ".rb": "ruby",
17
+ ".md": "markdown",
18
+ ".json": "json",
19
+ ".yaml": "yaml",
20
+ ".yml": "yaml",
21
+ ".html": "html",
22
+ ".css": "css",
23
+ ".scss": "scss",
24
+ ".sh": "bash",
25
+ ".toml": "toml",
26
+ };
27
+ export function languageFor(ext) {
28
+ return EXT_TO_LANG[ext.toLowerCase()] ?? "plaintext";
29
+ }
30
+ // Resolves `rel` against `realRoot` and returns the realpath only if it
31
+ // stays inside `realRoot` after symlink resolution. Returns null on
32
+ // containment failure, missing file, or any realpath error. `realRoot`
33
+ // must already be a realpath (caller handles the one-time root resolution).
34
+ export async function resolveContainedPath(realRoot, rel) {
35
+ const requested = path.resolve(realRoot, rel);
36
+ const lexContained = requested === realRoot || requested.startsWith(realRoot + path.sep);
37
+ if (!lexContained)
38
+ return null;
39
+ try {
40
+ const real = await realpath(requested);
41
+ const realContained = real === realRoot || real.startsWith(realRoot + path.sep);
42
+ return realContained ? real : null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function sendErr(res, status, error, message) {
49
+ res.status(status).json({ error, message });
50
+ }
51
+ function asyncHandler(fn) {
52
+ return (req, res) => {
53
+ fn(req, res).catch((err) => {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ sendErr(res, 500, "internal-error", msg);
56
+ });
57
+ };
58
+ }
59
+ export function createApiRouter(opts) {
60
+ const { root, files, diagramHandler } = opts;
61
+ const router = Router();
62
+ let cachedRealRoot = null;
63
+ async function getRealRoot() {
64
+ if (cachedRealRoot === null) {
65
+ cachedRealRoot = await realpath(root);
66
+ }
67
+ return cachedRealRoot;
68
+ }
69
+ router.get("/files", asyncHandler(async (req, res) => {
70
+ const raw = req.query.path;
71
+ // No `?path=` → list mode. Return the boot-time file index. Replaces
72
+ // miso's separate /tree route; t4 (web-shell) calls this for the
73
+ // sidebar.
74
+ if (raw === undefined) {
75
+ res.json({ files });
76
+ return;
77
+ }
78
+ if (typeof raw !== "string" || raw.length === 0) {
79
+ return sendErr(res, 400, "bad-path", "query param 'path' must be a non-empty string");
80
+ }
81
+ const realRoot = await getRealRoot();
82
+ const real = await resolveContainedPath(realRoot, raw);
83
+ if (real === null) {
84
+ // Distinguish missing vs traversal so the UI can show a sensible
85
+ // message. Re-do a lexical-only check to tell them apart.
86
+ const requested = path.resolve(realRoot, raw);
87
+ const lexContained = requested === realRoot || requested.startsWith(realRoot + path.sep);
88
+ if (!lexContained) {
89
+ return sendErr(res, 400, "path-traversal", "path escapes the selected root");
90
+ }
91
+ return sendErr(res, 404, "not-found", "file not found: " + raw);
92
+ }
93
+ const st = await stat(real);
94
+ if (!st.isFile()) {
95
+ return sendErr(res, 400, "not-a-file", "path is not a file: " + raw);
96
+ }
97
+ if (st.size > MAX_FILE_BYTES) {
98
+ return sendErr(res, 413, "file-too-large", "file exceeds " + MAX_FILE_BYTES + " bytes");
99
+ }
100
+ const content = await readFile(real, "utf8");
101
+ const language = languageFor(path.extname(real));
102
+ res.json({ path: raw, content, language });
103
+ }));
104
+ // /api/diagram — POST and GET both supported. POST is the recommended form
105
+ // (scope can be large); GET satisfies the curl verify command in the
106
+ // milestone manifest. When no handler is wired, return 503 so callers see a
107
+ // clear "this build was started without diagram support" message.
108
+ if (diagramHandler) {
109
+ router.post("/diagram", diagramHandler);
110
+ router.get("/diagram", diagramHandler);
111
+ }
112
+ else {
113
+ const stub = (_req, res) => {
114
+ sendErr(res, 503, "diagram-disabled", "diagram endpoint not configured (server started without diagram support)");
115
+ };
116
+ router.post("/diagram", stub);
117
+ router.get("/diagram", stub);
118
+ }
119
+ return { router };
120
+ }
121
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../server/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type DiagramSpec } from "../../shared/diagram-spec.js";
2
+ export interface CacheKeyArgs {
3
+ files: {
4
+ path: string;
5
+ content: string;
6
+ }[];
7
+ intent?: string;
8
+ model: string;
9
+ prompt_version: string;
10
+ }
11
+ export interface DiagramCache {
12
+ get(key: string): Promise<DiagramSpec | null>;
13
+ put(key: string, spec: DiagramSpec): Promise<void>;
14
+ readonly dir: string;
15
+ readonly disabled: boolean;
16
+ }
17
+ export interface CreateDiagramCacheOptions {
18
+ dir?: string;
19
+ }
20
+ export declare function defaultCacheDir(): string;
21
+ export declare function makeCacheKey(args: CacheKeyArgs): string;
22
+ export declare function createDiagramCache(opts?: CreateDiagramCacheOptions): DiagramCache;
23
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../server/diagram/cache.ts"],"names":[],"mappings":"AA8BA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,eAAe,IAAI,MAAM,CAWxC;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAiBvD;AAiBD,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,yBAA8B,GACnC,YAAY,CAsGd"}