onto-mcp 0.3.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 (447) hide show
  1. package/.onto/authority/core-lens-registry.yaml +134 -0
  2. package/.onto/authority/core-lexicon.yaml +1562 -0
  3. package/.onto/authority/diagnostic-codes.yaml +94 -0
  4. package/.onto/domains/accounting/competency_qs.md +384 -0
  5. package/.onto/domains/accounting/concepts.md +186 -0
  6. package/.onto/domains/accounting/conciseness_rules.md +160 -0
  7. package/.onto/domains/accounting/dependency_rules.md +239 -0
  8. package/.onto/domains/accounting/domain_scope.md +213 -0
  9. package/.onto/domains/accounting/extension_cases.md +416 -0
  10. package/.onto/domains/accounting/logic_rules.md +226 -0
  11. package/.onto/domains/accounting/structure_spec.md +298 -0
  12. package/.onto/domains/accounting-kr/competency_qs.md +562 -0
  13. package/.onto/domains/accounting-kr/concepts.md +187 -0
  14. package/.onto/domains/accounting-kr/conciseness_rules.md +125 -0
  15. package/.onto/domains/accounting-kr/dependency_rules.md +93 -0
  16. package/.onto/domains/accounting-kr/domain_scope.md +140 -0
  17. package/.onto/domains/accounting-kr/extension_cases.md +343 -0
  18. package/.onto/domains/accounting-kr/logic_rules.md +160 -0
  19. package/.onto/domains/accounting-kr/structure_spec.md +85 -0
  20. package/.onto/domains/business/competency_qs.md +263 -0
  21. package/.onto/domains/business/concepts.md +200 -0
  22. package/.onto/domains/business/conciseness_rules.md +135 -0
  23. package/.onto/domains/business/dependency_rules.md +113 -0
  24. package/.onto/domains/business/domain_scope.md +240 -0
  25. package/.onto/domains/business/extension_cases.md +249 -0
  26. package/.onto/domains/business/logic_rules.md +134 -0
  27. package/.onto/domains/business/structure_spec.md +114 -0
  28. package/.onto/domains/finance/competency_qs.md +362 -0
  29. package/.onto/domains/finance/concepts.md +194 -0
  30. package/.onto/domains/finance/conciseness_rules.md +155 -0
  31. package/.onto/domains/finance/dependency_rules.md +171 -0
  32. package/.onto/domains/finance/domain_scope.md +215 -0
  33. package/.onto/domains/finance/extension_cases.md +350 -0
  34. package/.onto/domains/finance/logic_rules.md +191 -0
  35. package/.onto/domains/finance/structure_spec.md +182 -0
  36. package/.onto/domains/llm-native-development/competency_qs.md +430 -0
  37. package/.onto/domains/llm-native-development/concepts.md +242 -0
  38. package/.onto/domains/llm-native-development/conciseness_rules.md +163 -0
  39. package/.onto/domains/llm-native-development/dependency_rules.md +216 -0
  40. package/.onto/domains/llm-native-development/domain_scope.md +197 -0
  41. package/.onto/domains/llm-native-development/extension_cases.md +474 -0
  42. package/.onto/domains/llm-native-development/logic_rules.md +123 -0
  43. package/.onto/domains/llm-native-development/prompt_interface.md +49 -0
  44. package/.onto/domains/llm-native-development/structure_spec.md +245 -0
  45. package/.onto/domains/market-intelligence/competency_qs.md +274 -0
  46. package/.onto/domains/market-intelligence/concepts.md +233 -0
  47. package/.onto/domains/market-intelligence/conciseness_rules.md +165 -0
  48. package/.onto/domains/market-intelligence/dependency_rules.md +197 -0
  49. package/.onto/domains/market-intelligence/domain_scope.md +231 -0
  50. package/.onto/domains/market-intelligence/extension_cases.md +425 -0
  51. package/.onto/domains/market-intelligence/logic_rules.md +247 -0
  52. package/.onto/domains/market-intelligence/structure_spec.md +209 -0
  53. package/.onto/domains/ontology/competency_qs.md +394 -0
  54. package/.onto/domains/ontology/concepts.md +172 -0
  55. package/.onto/domains/ontology/conciseness_rules.md +134 -0
  56. package/.onto/domains/ontology/dependency_rules.md +125 -0
  57. package/.onto/domains/ontology/domain_scope.md +114 -0
  58. package/.onto/domains/ontology/extension_cases.md +501 -0
  59. package/.onto/domains/ontology/logic_rules.md +114 -0
  60. package/.onto/domains/ontology/problem_framing_profile.md +67 -0
  61. package/.onto/domains/ontology/structure_spec.md +115 -0
  62. package/.onto/domains/palantir-foundry/RESEARCH_NOTES.md +911 -0
  63. package/.onto/domains/palantir-foundry/competency_qs.md +191 -0
  64. package/.onto/domains/palantir-foundry/competitive_comparison.md +329 -0
  65. package/.onto/domains/palantir-foundry/concepts.md +197 -0
  66. package/.onto/domains/palantir-foundry/conciseness_rules.md +245 -0
  67. package/.onto/domains/palantir-foundry/dependency_rules.md +135 -0
  68. package/.onto/domains/palantir-foundry/domain_scope.md +395 -0
  69. package/.onto/domains/palantir-foundry/extension_cases.md +210 -0
  70. package/.onto/domains/palantir-foundry/logic_rules.md +172 -0
  71. package/.onto/domains/palantir-foundry/structure_spec.md +291 -0
  72. package/.onto/domains/software-engineering/competency_qs.md +538 -0
  73. package/.onto/domains/software-engineering/concepts.md +238 -0
  74. package/.onto/domains/software-engineering/conciseness_rules.md +167 -0
  75. package/.onto/domains/software-engineering/dependency_rules.md +216 -0
  76. package/.onto/domains/software-engineering/domain_scope.md +183 -0
  77. package/.onto/domains/software-engineering/extension_cases.md +551 -0
  78. package/.onto/domains/software-engineering/logic_rules.md +240 -0
  79. package/.onto/domains/software-engineering/problem_framing_profile.md +68 -0
  80. package/.onto/domains/software-engineering/structure_spec.md +185 -0
  81. package/.onto/domains/ui-design/competency_qs.md +567 -0
  82. package/.onto/domains/ui-design/concepts.md +194 -0
  83. package/.onto/domains/ui-design/conciseness_rules.md +190 -0
  84. package/.onto/domains/ui-design/dependency_rules.md +323 -0
  85. package/.onto/domains/ui-design/domain_scope.md +340 -0
  86. package/.onto/domains/ui-design/extension_cases.md +563 -0
  87. package/.onto/domains/ui-design/logic_rules.md +349 -0
  88. package/.onto/domains/ui-design/structure_spec.md +252 -0
  89. package/.onto/domains/visual-design/competency_qs.md +472 -0
  90. package/.onto/domains/visual-design/concepts.md +147 -0
  91. package/.onto/domains/visual-design/conciseness_rules.md +186 -0
  92. package/.onto/domains/visual-design/dependency_rules.md +282 -0
  93. package/.onto/domains/visual-design/domain_scope.md +290 -0
  94. package/.onto/domains/visual-design/extension_cases.md +480 -0
  95. package/.onto/domains/visual-design/logic_rules.md +232 -0
  96. package/.onto/domains/visual-design/structure_spec.md +213 -0
  97. package/.onto/principles/llm-native-development-guideline.md +401 -0
  98. package/.onto/principles/llm-runtime-interface-principles.md +665 -0
  99. package/.onto/principles/non-specialist-communication-guideline.md +74 -0
  100. package/.onto/principles/ontology-as-code-guideline.md +243 -0
  101. package/.onto/principles/ontology-as-code-naming-charter.md +130 -0
  102. package/.onto/principles/product-locality-principle.md +129 -0
  103. package/.onto/principles/productization-charter.md +569 -0
  104. package/.onto/processes/evolve/material-kind-adapter-contract.md +113 -0
  105. package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +366 -0
  106. package/.onto/processes/reconstruct/source-profile-contract.md +107 -0
  107. package/.onto/processes/reconstruct/source-profiles/code.md +72 -0
  108. package/.onto/processes/reconstruct/source-profiles/database.md +74 -0
  109. package/.onto/processes/reconstruct/source-profiles/document.md +71 -0
  110. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +79 -0
  111. package/.onto/processes/review/binding-contract.md +270 -0
  112. package/.onto/processes/review/execution-preparation-artifacts.md +281 -0
  113. package/.onto/processes/review/interpretation-contract.md +245 -0
  114. package/.onto/processes/review/issue-stance-deliberation-contract.md +761 -0
  115. package/.onto/processes/review/lens-prompt-contract.md +402 -0
  116. package/.onto/processes/review/lens-registry.md +127 -0
  117. package/.onto/processes/review/pre-dispatch-contracts.md +428 -0
  118. package/.onto/processes/review/productized-live-path.md +398 -0
  119. package/.onto/processes/review/prompt-execution-runner-contract.md +187 -0
  120. package/.onto/processes/review/record-contract.md +427 -0
  121. package/.onto/processes/review/record-field-mapping.md +337 -0
  122. package/.onto/processes/review/review-context-manifest-contract.md +356 -0
  123. package/.onto/processes/review/review-execution-ux-contract.md +809 -0
  124. package/.onto/processes/review/review-target-profile-contract.md +259 -0
  125. package/.onto/processes/review/shared-phenomenon-contract.md +129 -0
  126. package/.onto/processes/review/synthesize-prompt-contract.md +343 -0
  127. package/.onto/processes/shared/target-material-kind-contract.md +198 -0
  128. package/.onto/roles/axiology.md +81 -0
  129. package/.onto/roles/conciseness.md +36 -0
  130. package/.onto/roles/coverage.md +34 -0
  131. package/.onto/roles/dependency.md +37 -0
  132. package/.onto/roles/evolution.md +35 -0
  133. package/.onto/roles/logic.md +104 -0
  134. package/.onto/roles/pragmatics.md +32 -0
  135. package/.onto/roles/semantics.md +36 -0
  136. package/.onto/roles/structure.md +33 -0
  137. package/.onto/roles/synthesize.md +92 -0
  138. package/AGENTS.md +240 -0
  139. package/CLAUDE.md +39 -0
  140. package/README.md +287 -0
  141. package/bin/onto +92 -0
  142. package/dist/cli.js +101 -0
  143. package/dist/core-api/reconstruct-api.js +222 -0
  144. package/dist/core-api/review-api.js +1271 -0
  145. package/dist/core-runtime/cli/assemble-review-record.js +431 -0
  146. package/dist/core-runtime/cli/bootstrap-review-binding.js +186 -0
  147. package/dist/core-runtime/cli/codex-nested-dispatch.js +226 -0
  148. package/dist/core-runtime/cli/codex-nested-dispatch.test.js +390 -0
  149. package/dist/core-runtime/cli/codex-nested-teamlead-executor.js +464 -0
  150. package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +335 -0
  151. package/dist/core-runtime/cli/codex-review-unit-executor.js +228 -0
  152. package/dist/core-runtime/cli/complete-review-session.js +64 -0
  153. package/dist/core-runtime/cli/complexity-assessment.js +153 -0
  154. package/dist/core-runtime/cli/coordinator-helpers.js +583 -0
  155. package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +167 -0
  156. package/dist/core-runtime/cli/coordinator-state-machine.js +794 -0
  157. package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +615 -0
  158. package/dist/core-runtime/cli/e2e-start-review-session.test.js +312 -0
  159. package/dist/core-runtime/cli/health.js +44 -0
  160. package/dist/core-runtime/cli/inline-http-review-unit-executor.js +656 -0
  161. package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +567 -0
  162. package/dist/core-runtime/cli/materialize-review-execution-preparation.js +104 -0
  163. package/dist/core-runtime/cli/materialize-review-prompt-packets.js +952 -0
  164. package/dist/core-runtime/cli/migrate-session-roots.js +118 -0
  165. package/dist/core-runtime/cli/mock-review-unit-executor.js +285 -0
  166. package/dist/core-runtime/cli/onto-tools.js +369 -0
  167. package/dist/core-runtime/cli/prepare-review-session.js +272 -0
  168. package/dist/core-runtime/cli/render-review-final-output.js +350 -0
  169. package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +106 -0
  170. package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +268 -0
  171. package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +136 -0
  172. package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +201 -0
  173. package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +192 -0
  174. package/dist/core-runtime/cli/review-invoke.js +2030 -0
  175. package/dist/core-runtime/cli/run-review-prompt-execution.js +2152 -0
  176. package/dist/core-runtime/cli/session-root-guard.js +168 -0
  177. package/dist/core-runtime/cli/spawn-watcher.js +173 -0
  178. package/dist/core-runtime/cli/spawn-watcher.test.js +457 -0
  179. package/dist/core-runtime/cli/start-review-session.js +68 -0
  180. package/dist/core-runtime/cli/strip-wrapping-code-fence.js +56 -0
  181. package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +79 -0
  182. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +412 -0
  183. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +351 -0
  184. package/dist/core-runtime/cli/topology-executor-mapping.js +139 -0
  185. package/dist/core-runtime/cli/topology-executor-mapping.test.js +173 -0
  186. package/dist/core-runtime/cli/write-review-interpretation.js +81 -0
  187. package/dist/core-runtime/config/onto-config-cli.js +278 -0
  188. package/dist/core-runtime/config/onto-config-key-path.js +288 -0
  189. package/dist/core-runtime/config/onto-config-key-path.test.js +195 -0
  190. package/dist/core-runtime/config/onto-config-preview.js +108 -0
  191. package/dist/core-runtime/config/onto-config-preview.test.js +132 -0
  192. package/dist/core-runtime/discovery/config-chain.js +118 -0
  193. package/dist/core-runtime/discovery/config-chain.test.js +103 -0
  194. package/dist/core-runtime/discovery/config-profile.js +199 -0
  195. package/dist/core-runtime/discovery/config-profile.test.js +233 -0
  196. package/dist/core-runtime/discovery/host-detection.js +33 -0
  197. package/dist/core-runtime/discovery/host-detection.test.js +186 -0
  198. package/dist/core-runtime/discovery/installation-paths.js +21 -0
  199. package/dist/core-runtime/discovery/installation-paths.test.js +65 -0
  200. package/dist/core-runtime/discovery/lens-registry.js +60 -0
  201. package/dist/core-runtime/discovery/lens-registry.test.js +81 -0
  202. package/dist/core-runtime/discovery/onto-home.js +71 -0
  203. package/dist/core-runtime/discovery/path-normalization.js +28 -0
  204. package/dist/core-runtime/discovery/path-normalization.test.js +22 -0
  205. package/dist/core-runtime/discovery/plugin-path.js +72 -0
  206. package/dist/core-runtime/discovery/plugin-path.test.js +95 -0
  207. package/dist/core-runtime/discovery/project-root.js +47 -0
  208. package/dist/core-runtime/discovery/settings-chain.js +353 -0
  209. package/dist/core-runtime/discovery/walk-up.js +17 -0
  210. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +344 -0
  211. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +915 -0
  212. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +564 -0
  213. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +708 -0
  214. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +165 -0
  215. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +227 -0
  216. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +59 -0
  217. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +205 -0
  218. package/dist/core-runtime/evolve/adapters/methodology/adapter.js +16 -0
  219. package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +9 -0
  220. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +298 -0
  221. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +70 -0
  222. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +46 -0
  223. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +73 -0
  224. package/dist/core-runtime/evolve/adapters/registry.js +47 -0
  225. package/dist/core-runtime/evolve/adapters/registry.test.js +67 -0
  226. package/dist/core-runtime/evolve/cli.js +256 -0
  227. package/dist/core-runtime/evolve/commands/align.js +194 -0
  228. package/dist/core-runtime/evolve/commands/align.test.js +82 -0
  229. package/dist/core-runtime/evolve/commands/apply.js +161 -0
  230. package/dist/core-runtime/evolve/commands/apply.test.js +138 -0
  231. package/dist/core-runtime/evolve/commands/close.js +39 -0
  232. package/dist/core-runtime/evolve/commands/close.test.js +99 -0
  233. package/dist/core-runtime/evolve/commands/defer.js +40 -0
  234. package/dist/core-runtime/evolve/commands/defer.test.js +134 -0
  235. package/dist/core-runtime/evolve/commands/draft.js +323 -0
  236. package/dist/core-runtime/evolve/commands/draft.test.js +178 -0
  237. package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +208 -0
  238. package/dist/core-runtime/evolve/commands/error-messages.js +125 -0
  239. package/dist/core-runtime/evolve/commands/error-messages.test.js +167 -0
  240. package/dist/core-runtime/evolve/commands/propose-align.js +222 -0
  241. package/dist/core-runtime/evolve/commands/propose-align.test.js +136 -0
  242. package/dist/core-runtime/evolve/commands/reconstruct.js +330 -0
  243. package/dist/core-runtime/evolve/commands/reconstruct.test.js +278 -0
  244. package/dist/core-runtime/evolve/commands/shared.js +22 -0
  245. package/dist/core-runtime/evolve/commands/stale-check.js +103 -0
  246. package/dist/core-runtime/evolve/commands/stale-check.test.js +84 -0
  247. package/dist/core-runtime/evolve/commands/start.js +887 -0
  248. package/dist/core-runtime/evolve/commands/start.test.js +396 -0
  249. package/dist/core-runtime/evolve/config/project-config.js +99 -0
  250. package/dist/core-runtime/evolve/config/project-config.test.js +170 -0
  251. package/dist/core-runtime/evolve/renderers/align-packet.js +280 -0
  252. package/dist/core-runtime/evolve/renderers/align-packet.test.js +332 -0
  253. package/dist/core-runtime/evolve/renderers/draft-packet.js +303 -0
  254. package/dist/core-runtime/evolve/renderers/draft-packet.test.js +377 -0
  255. package/dist/core-runtime/evolve/renderers/format.js +5 -0
  256. package/dist/core-runtime/evolve/renderers/scope-md.js +237 -0
  257. package/dist/core-runtime/evolve/renderers/scope-md.test.js +306 -0
  258. package/dist/core-runtime/govern/cli.js +369 -0
  259. package/dist/core-runtime/govern/cli.test.js +314 -0
  260. package/dist/core-runtime/govern/drift-engine.js +103 -0
  261. package/dist/core-runtime/govern/drift-engine.test.js +319 -0
  262. package/dist/core-runtime/govern/promote-principle.js +206 -0
  263. package/dist/core-runtime/govern/promote-principle.test.js +368 -0
  264. package/dist/core-runtime/govern/queue.js +81 -0
  265. package/dist/core-runtime/govern/types.js +16 -0
  266. package/dist/core-runtime/install/cli.js +530 -0
  267. package/dist/core-runtime/install/detect.js +128 -0
  268. package/dist/core-runtime/install/detect.test.js +155 -0
  269. package/dist/core-runtime/install/gitignore-update.js +74 -0
  270. package/dist/core-runtime/install/gitignore-update.test.js +64 -0
  271. package/dist/core-runtime/install/install-integration.test.js +373 -0
  272. package/dist/core-runtime/install/prompts.js +389 -0
  273. package/dist/core-runtime/install/prompts.test.js +293 -0
  274. package/dist/core-runtime/install/types.js +26 -0
  275. package/dist/core-runtime/install/validation.js +295 -0
  276. package/dist/core-runtime/install/validation.test.js +313 -0
  277. package/dist/core-runtime/install/writer.js +254 -0
  278. package/dist/core-runtime/install/writer.test.js +218 -0
  279. package/dist/core-runtime/learning/extractor.js +461 -0
  280. package/dist/core-runtime/learning/feedback.js +179 -0
  281. package/dist/core-runtime/learning/health-report.js +165 -0
  282. package/dist/core-runtime/learning/health-report.test.js +169 -0
  283. package/dist/core-runtime/learning/loader.js +388 -0
  284. package/dist/core-runtime/learning/loader.test.js +102 -0
  285. package/dist/core-runtime/learning/promote/apply-state.js +240 -0
  286. package/dist/core-runtime/learning/promote/audit-obligation.js +195 -0
  287. package/dist/core-runtime/learning/promote/collector.js +432 -0
  288. package/dist/core-runtime/learning/promote/degraded-state.js +125 -0
  289. package/dist/core-runtime/learning/promote/domain-doc-proposer.js +166 -0
  290. package/dist/core-runtime/learning/promote/e2e-promote.test.js +6385 -0
  291. package/dist/core-runtime/learning/promote/health-snapshot.js +150 -0
  292. package/dist/core-runtime/learning/promote/insight-reclassifier.js +544 -0
  293. package/dist/core-runtime/learning/promote/judgment-auditor.js +517 -0
  294. package/dist/core-runtime/learning/promote/panel-reviewer.js +1158 -0
  295. package/dist/core-runtime/learning/promote/promote-executor.js +1675 -0
  296. package/dist/core-runtime/learning/promote/promoter.js +307 -0
  297. package/dist/core-runtime/learning/promote/retirement.js +122 -0
  298. package/dist/core-runtime/learning/promote/types.js +23 -0
  299. package/dist/core-runtime/learning/prompt-sections.js +51 -0
  300. package/dist/core-runtime/learning/shared/artifact-registry-init.js +45 -0
  301. package/dist/core-runtime/learning/shared/artifact-registry.js +254 -0
  302. package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +73 -0
  303. package/dist/core-runtime/learning/shared/audit-state.js +99 -0
  304. package/dist/core-runtime/learning/shared/duplicate-check.js +28 -0
  305. package/dist/core-runtime/learning/shared/llm-caller.js +831 -0
  306. package/dist/core-runtime/learning/shared/llm-caller.test.js +601 -0
  307. package/dist/core-runtime/learning/shared/llm-tool-loop.js +393 -0
  308. package/dist/core-runtime/learning/shared/mode.js +25 -0
  309. package/dist/core-runtime/learning/shared/paths.js +84 -0
  310. package/dist/core-runtime/learning/shared/paths.test.js +79 -0
  311. package/dist/core-runtime/learning/shared/patterns.js +37 -0
  312. package/dist/core-runtime/learning/shared/recoverability.js +355 -0
  313. package/dist/core-runtime/learning/shared/recovery-context.js +374 -0
  314. package/dist/core-runtime/learning/shared/scope.js +1 -0
  315. package/dist/core-runtime/learning/shared/semantic-classifier.js +94 -0
  316. package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +42 -0
  317. package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +37 -0
  318. package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +39 -0
  319. package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +41 -0
  320. package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +38 -0
  321. package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +43 -0
  322. package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +113 -0
  323. package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +36 -0
  324. package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +48 -0
  325. package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +43 -0
  326. package/dist/core-runtime/learning/shared/specs/spec-helpers.js +64 -0
  327. package/dist/core-runtime/learning/usage-tracker.js +190 -0
  328. package/dist/core-runtime/learning/usage-tracker.test.js +176 -0
  329. package/dist/core-runtime/llm/llm-caller.js +649 -0
  330. package/dist/core-runtime/llm/llm-tool-loop.js +401 -0
  331. package/dist/core-runtime/llm/model-switcher.js +62 -0
  332. package/dist/core-runtime/logger.js +22 -0
  333. package/dist/core-runtime/onboard/detect-review-axes.js +122 -0
  334. package/dist/core-runtime/onboard/detect-review-axes.test.js +127 -0
  335. package/dist/core-runtime/onboard/write-review-block.js +188 -0
  336. package/dist/core-runtime/onboard/write-review-block.test.js +240 -0
  337. package/dist/core-runtime/readers/brownfield-builder.js +150 -0
  338. package/dist/core-runtime/readers/brownfield-builder.test.js +136 -0
  339. package/dist/core-runtime/readers/code-chunk-collector.js +53 -0
  340. package/dist/core-runtime/readers/code-chunk-collector.test.js +136 -0
  341. package/dist/core-runtime/readers/file-utils.js +240 -0
  342. package/dist/core-runtime/readers/file-utils.test.js +146 -0
  343. package/dist/core-runtime/readers/lexicon-citation-check.js +93 -0
  344. package/dist/core-runtime/readers/lexicon-citation-check.test.js +77 -0
  345. package/dist/core-runtime/readers/mcp-figma.js +30 -0
  346. package/dist/core-runtime/readers/mcp-figma.test.js +82 -0
  347. package/dist/core-runtime/readers/mcp-generic.js +31 -0
  348. package/dist/core-runtime/readers/mcp-generic.test.js +76 -0
  349. package/dist/core-runtime/readers/ontology-index.js +148 -0
  350. package/dist/core-runtime/readers/ontology-index.test.js +245 -0
  351. package/dist/core-runtime/readers/ontology-query.js +168 -0
  352. package/dist/core-runtime/readers/ontology-query.test.js +311 -0
  353. package/dist/core-runtime/readers/ontology-resolve.js +48 -0
  354. package/dist/core-runtime/readers/ontology-resolve.test.js +48 -0
  355. package/dist/core-runtime/readers/patterns/index.js +7 -0
  356. package/dist/core-runtime/readers/review-log.js +213 -0
  357. package/dist/core-runtime/readers/review-log.test.js +313 -0
  358. package/dist/core-runtime/readers/scan-local.js +102 -0
  359. package/dist/core-runtime/readers/scan-local.test.js +102 -0
  360. package/dist/core-runtime/readers/scan-tarball.js +121 -0
  361. package/dist/core-runtime/readers/scan-tarball.test.js +283 -0
  362. package/dist/core-runtime/readers/scan-vault.js +34 -0
  363. package/dist/core-runtime/readers/scan-vault.test.js +81 -0
  364. package/dist/core-runtime/readers/types.js +42 -0
  365. package/dist/core-runtime/readers/types.test.js +94 -0
  366. package/dist/core-runtime/readers/viewpoint-collectors.js +229 -0
  367. package/dist/core-runtime/reconstruct/artifact-types.js +1 -0
  368. package/dist/core-runtime/reconstruct/directive-validation.js +123 -0
  369. package/dist/core-runtime/reconstruct/materialize-preparation.js +251 -0
  370. package/dist/core-runtime/reconstruct/record.js +198 -0
  371. package/dist/core-runtime/reconstruct/run.js +578 -0
  372. package/dist/core-runtime/reconstruct/seed-candidate-validation.js +356 -0
  373. package/dist/core-runtime/reconstruct/source-observations.js +62 -0
  374. package/dist/core-runtime/reconstruct/source-profiles.js +73 -0
  375. package/dist/core-runtime/release-channel/release-channel.js +90 -0
  376. package/dist/core-runtime/review/artifact-types.js +13 -0
  377. package/dist/core-runtime/review/citation-audit.js +204 -0
  378. package/dist/core-runtime/review/citation-audit.test.js +165 -0
  379. package/dist/core-runtime/review/controlled-lens-deliberation.js +125 -0
  380. package/dist/core-runtime/review/execution-plan-resolver.js +247 -0
  381. package/dist/core-runtime/review/execution-plan-resolver.test.js +243 -0
  382. package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +246 -0
  383. package/dist/core-runtime/review/execution-topology-resolver.js +401 -0
  384. package/dist/core-runtime/review/execution-topology-resolver.test.js +315 -0
  385. package/dist/core-runtime/review/failure-records.js +57 -0
  386. package/dist/core-runtime/review/inline-context-embedder.js +141 -0
  387. package/dist/core-runtime/review/inline-context-embedder.test.js +154 -0
  388. package/dist/core-runtime/review/issue-artifact-runtime.js +859 -0
  389. package/dist/core-runtime/review/legacy-mode-policy.js +88 -0
  390. package/dist/core-runtime/review/lens-completion-policy.js +17 -0
  391. package/dist/core-runtime/review/materializers-effort-persist.test.js +79 -0
  392. package/dist/core-runtime/review/materializers.js +963 -0
  393. package/dist/core-runtime/review/ontology-path-classifier.js +179 -0
  394. package/dist/core-runtime/review/ontology-path-classifier.test.js +216 -0
  395. package/dist/core-runtime/review/packet-boundary-policy.js +215 -0
  396. package/dist/core-runtime/review/packet-boundary-policy.test.js +107 -0
  397. package/dist/core-runtime/review/participating-lens-paths.js +61 -0
  398. package/dist/core-runtime/review/participating-lens-paths.test.js +73 -0
  399. package/dist/core-runtime/review/review-artifact-utils.js +287 -0
  400. package/dist/core-runtime/review/review-config-legacy-translate.js +244 -0
  401. package/dist/core-runtime/review/review-config-legacy-translate.test.js +161 -0
  402. package/dist/core-runtime/review/review-config-validator.js +289 -0
  403. package/dist/core-runtime/review/review-config-validator.test.js +236 -0
  404. package/dist/core-runtime/review/review-execution-profile.js +193 -0
  405. package/dist/core-runtime/review/review-execution-route.js +52 -0
  406. package/dist/core-runtime/review/review-progress-contract.js +123 -0
  407. package/dist/core-runtime/review/review-record-validation.js +251 -0
  408. package/dist/core-runtime/review/review-result-classification.js +379 -0
  409. package/dist/core-runtime/review/review-state-machine.js +39 -0
  410. package/dist/core-runtime/review/route-visibility.js +125 -0
  411. package/dist/core-runtime/review/shape-pipeline-audit.test.js +311 -0
  412. package/dist/core-runtime/review/shape-to-topology-id.js +117 -0
  413. package/dist/core-runtime/review/shape-to-topology-id.test.js +132 -0
  414. package/dist/core-runtime/review/topology-shape-derivation.js +155 -0
  415. package/dist/core-runtime/review/topology-shape-derivation.test.js +195 -0
  416. package/dist/core-runtime/scope-runtime/constants.js +12 -0
  417. package/dist/core-runtime/scope-runtime/constraint-pool.js +166 -0
  418. package/dist/core-runtime/scope-runtime/constraint-pool.test.js +674 -0
  419. package/dist/core-runtime/scope-runtime/domain-validation-log.js +135 -0
  420. package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +156 -0
  421. package/dist/core-runtime/scope-runtime/eval-persistence.js +65 -0
  422. package/dist/core-runtime/scope-runtime/eval-persistence.test.js +84 -0
  423. package/dist/core-runtime/scope-runtime/event-pipeline.js +64 -0
  424. package/dist/core-runtime/scope-runtime/event-pipeline.test.js +450 -0
  425. package/dist/core-runtime/scope-runtime/event-store.js +39 -0
  426. package/dist/core-runtime/scope-runtime/event-store.test.js +95 -0
  427. package/dist/core-runtime/scope-runtime/gate-guard.js +348 -0
  428. package/dist/core-runtime/scope-runtime/gate-guard.test.js +1047 -0
  429. package/dist/core-runtime/scope-runtime/hash.js +4 -0
  430. package/dist/core-runtime/scope-runtime/hash.test.js +33 -0
  431. package/dist/core-runtime/scope-runtime/id.js +4 -0
  432. package/dist/core-runtime/scope-runtime/id.test.js +17 -0
  433. package/dist/core-runtime/scope-runtime/reducer.js +297 -0
  434. package/dist/core-runtime/scope-runtime/reducer.test.js +759 -0
  435. package/dist/core-runtime/scope-runtime/scope-manager.js +161 -0
  436. package/dist/core-runtime/scope-runtime/state-machine.js +309 -0
  437. package/dist/core-runtime/scope-runtime/state-machine.test.js +704 -0
  438. package/dist/core-runtime/scope-runtime/types.js +116 -0
  439. package/dist/core-runtime/scope-runtime/types.test.js +69 -0
  440. package/dist/core-runtime/target-material-kind.js +256 -0
  441. package/dist/core-runtime/translate/render-for-user.js +169 -0
  442. package/dist/core-runtime/translate/render-for-user.test.js +122 -0
  443. package/dist/mcp/server.js +1011 -0
  444. package/dist/mcp/tool-schemas.js +93 -0
  445. package/dist/providers/capability-contract.js +1 -0
  446. package/package.json +68 -0
  447. package/settings.example.json +33 -0
@@ -0,0 +1,1011 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { createOntoReviewCoreApi, } from "../core-api/review-api.js";
6
+ import { createOntoReconstructCoreApi, } from "../core-api/reconstruct-api.js";
7
+ import { OntoSettingsValidationError, UnsupportedOntoConfigFilesError, } from "../core-runtime/discovery/settings-chain.js";
8
+ import { readOntoVersion } from "../core-runtime/release-channel/release-channel.js";
9
+ import { createStructuredFailureRecord, ReviewStructuredFailureError, } from "../core-runtime/review/failure-records.js";
10
+ import { buildReviewRouteVisibilityFromFailure, } from "../core-runtime/review/route-visibility.js";
11
+ import { fileExists, readYamlDocument } from "../core-runtime/review/review-artifact-utils.js";
12
+ import { OntoListDomainsToolInputSchema, OntoListSourceProfilesToolInputSchema, OntoObserveSourceToolInputSchema, OntoPrepareReviewToolInputSchema, OntoReconstructSessionInputSchema, OntoReconstructToolInputSchema, OntoReviewSessionInputSchema, OntoReviewToolInputSchema, OntoValidateReconstructDirectiveToolInputSchema, } from "./tool-schemas.js";
13
+ const reviewApi = createOntoReviewCoreApi();
14
+ const reconstructApi = createOntoReconstructCoreApi();
15
+ const REVIEW_INPUT_SCHEMA = {
16
+ type: "object",
17
+ additionalProperties: false,
18
+ required: ["target", "intent"],
19
+ properties: {
20
+ target: {
21
+ type: "string",
22
+ description: "File, directory, or target token to review.",
23
+ },
24
+ targetScopeKind: {
25
+ type: "string",
26
+ enum: ["file", "directory", "bundle"],
27
+ description: "Optional explicit target shape. Use bundle with primaryRef/memberRefs for multi-artifact review.",
28
+ },
29
+ primaryRef: {
30
+ type: "string",
31
+ description: "Primary artifact ref for an explicit bundle target. Defaults to target when omitted.",
32
+ },
33
+ memberRefs: {
34
+ type: "array",
35
+ items: { type: "string" },
36
+ description: "Supporting artifact refs for an explicit bundle target.",
37
+ },
38
+ bundleKind: {
39
+ type: "string",
40
+ description: "Optional bundle classifier such as implementation_change_bundle.",
41
+ },
42
+ diffRange: {
43
+ type: "string",
44
+ description: "Optional git diff range. When set, review materializes the diff as the target basis.",
45
+ },
46
+ intent: {
47
+ type: "string",
48
+ description: "What the review should verify or decide.",
49
+ },
50
+ projectRoot: {
51
+ type: "string",
52
+ description: "Project root. Defaults to the MCP server working directory.",
53
+ },
54
+ domain: {
55
+ type: "string",
56
+ description: "Optional domain id whose domain documents should guide the review.",
57
+ },
58
+ noDomain: {
59
+ type: "boolean",
60
+ description: "Run without domain documents. Mutually exclusive with domain.",
61
+ },
62
+ reviewMode: {
63
+ type: "string",
64
+ enum: ["core-axis", "full"],
65
+ description: "Lens set size. core-axis is cheaper; full runs every core lens.",
66
+ },
67
+ lensIds: {
68
+ type: "array",
69
+ items: { type: "string" },
70
+ description: "Optional explicit lens ids. Omit to use reviewMode defaults.",
71
+ },
72
+ deliberation: {
73
+ type: "string",
74
+ enum: ["controlled_lens_deliberation"],
75
+ description: "Controlled lens-to-lens deliberation under teamlead authority. This is the default review path.",
76
+ },
77
+ executorRealization: {
78
+ type: "string",
79
+ enum: ["codex", "mock", "ts_inline_http"],
80
+ description: "Debug/testing override. Normal callers should omit this and use project config.",
81
+ },
82
+ confirmValueAlignment: {
83
+ type: "boolean",
84
+ description: "Explicitly confirms review value-alignment criteria when the invocation contains known ambiguity. Omit unless the user has confirmed the criteria.",
85
+ },
86
+ prepareOnly: {
87
+ type: "boolean",
88
+ description: "When true, materialize artifacts without executing lens units.",
89
+ },
90
+ },
91
+ };
92
+ const SESSION_INPUT_SCHEMA = {
93
+ type: "object",
94
+ additionalProperties: false,
95
+ required: ["sessionRoot"],
96
+ properties: {
97
+ sessionRoot: {
98
+ type: "string",
99
+ description: "Absolute or project-relative review session root.",
100
+ },
101
+ projectRoot: {
102
+ type: "string",
103
+ description: "Project root that owns the review session. Defaults to the MCP server working directory.",
104
+ },
105
+ },
106
+ };
107
+ const LIST_DOMAINS_INPUT_SCHEMA = {
108
+ type: "object",
109
+ additionalProperties: false,
110
+ properties: {
111
+ projectRoot: {
112
+ type: "string",
113
+ description: "Project root whose project-local domains should be included.",
114
+ },
115
+ },
116
+ };
117
+ const LIST_SOURCE_PROFILES_INPUT_SCHEMA = {
118
+ type: "object",
119
+ additionalProperties: false,
120
+ properties: {
121
+ projectRoot: {
122
+ type: "string",
123
+ description: "Project root. Defaults to the MCP server working directory.",
124
+ },
125
+ },
126
+ };
127
+ const OBSERVE_SOURCE_INPUT_SCHEMA = {
128
+ type: "object",
129
+ additionalProperties: false,
130
+ required: ["targetRefs"],
131
+ properties: {
132
+ targetRefs: {
133
+ type: "array",
134
+ items: { type: "string" },
135
+ minItems: 1,
136
+ description: "Project-relative target refs to classify and observe structurally.",
137
+ },
138
+ projectRoot: {
139
+ type: "string",
140
+ description: "Project root. Defaults to the MCP server working directory.",
141
+ },
142
+ sessionRoot: {
143
+ type: "string",
144
+ description: "Optional reconstruct session root. Must stay inside projectRoot/.onto/reconstruct.",
145
+ },
146
+ profilesRoot: {
147
+ type: "string",
148
+ description: "Optional reconstruct source profile root. Normally omitted.",
149
+ },
150
+ filesystemAllowedRoots: {
151
+ type: "array",
152
+ items: { type: "string" },
153
+ description: "Optional project-relative filesystem roots for observation boundary reporting.",
154
+ },
155
+ },
156
+ };
157
+ const RECONSTRUCT_INPUT_SCHEMA = {
158
+ type: "object",
159
+ additionalProperties: false,
160
+ required: [
161
+ "targetRefs",
162
+ "intent",
163
+ "semanticAuthorRealization",
164
+ "confirmationProviderRealization",
165
+ ],
166
+ properties: {
167
+ targetRefs: {
168
+ type: "array",
169
+ items: { type: "string" },
170
+ minItems: 1,
171
+ description: "Project-relative target refs to classify, observe, and reconstruct.",
172
+ },
173
+ projectRoot: {
174
+ type: "string",
175
+ description: "Project root. Defaults to the MCP server working directory.",
176
+ },
177
+ sessionRoot: {
178
+ type: "string",
179
+ description: "Optional reconstruct session root. Must stay inside projectRoot/.onto/reconstruct.",
180
+ },
181
+ profilesRoot: {
182
+ type: "string",
183
+ description: "Optional reconstruct source profile root. Normally omitted.",
184
+ },
185
+ filesystemAllowedRoots: {
186
+ type: "array",
187
+ items: { type: "string" },
188
+ description: "Optional project-relative filesystem roots for observation boundary reporting.",
189
+ },
190
+ intent: {
191
+ type: "string",
192
+ description: "Declared reconstruction purpose. The runner passes this to the directive author and does not infer ontology meaning itself.",
193
+ },
194
+ semanticAuthorRealization: {
195
+ type: "string",
196
+ enum: ["mock"],
197
+ description: "Explicit semantic author realization. Only mock is currently wired; host/direct-call authoring is not yet exposed.",
198
+ },
199
+ confirmationProviderRealization: {
200
+ type: "string",
201
+ enum: ["mock"],
202
+ description: "Explicit confirmation provider realization. Only mock is currently wired; user-mediated confirmation is not yet exposed.",
203
+ },
204
+ },
205
+ };
206
+ const RECONSTRUCT_SESSION_INPUT_SCHEMA = {
207
+ type: "object",
208
+ additionalProperties: false,
209
+ required: ["sessionRoot"],
210
+ properties: {
211
+ sessionRoot: {
212
+ type: "string",
213
+ description: "Absolute or project-relative reconstruct session root under projectRoot/.onto/reconstruct.",
214
+ },
215
+ projectRoot: {
216
+ type: "string",
217
+ description: "Project root. Defaults to the MCP server working directory.",
218
+ },
219
+ },
220
+ };
221
+ const VALIDATE_RECONSTRUCT_DIRECTIVE_INPUT_SCHEMA = {
222
+ type: "object",
223
+ additionalProperties: false,
224
+ required: ["directiveKind", "sourceObservationsPath"],
225
+ properties: {
226
+ directiveKind: {
227
+ type: "string",
228
+ enum: ["source_observation", "seed_candidate"],
229
+ description: "Which LLM-authored reconstruct directive shape to validate.",
230
+ },
231
+ projectRoot: {
232
+ type: "string",
233
+ description: "Project root. Defaults to the MCP server working directory.",
234
+ },
235
+ directivePath: {
236
+ type: "string",
237
+ description: "Path to source-observation-directive.yaml when directiveKind=source_observation.",
238
+ },
239
+ seedCandidatePath: {
240
+ type: "string",
241
+ description: "Path to seed-candidate.yaml when directiveKind=seed_candidate.",
242
+ },
243
+ sourceObservationsPath: {
244
+ type: "string",
245
+ description: "Path to source-observations.yaml.",
246
+ },
247
+ sourceObservationDirectivePath: {
248
+ type: "string",
249
+ description: "Optional path to source-observation-directive.yaml for Seed validation.",
250
+ },
251
+ sourceObservationDirectiveValidationPath: {
252
+ type: "string",
253
+ description: "Optional path to source-observation-directive-validation.yaml for Seed validation.",
254
+ },
255
+ outputPath: {
256
+ type: "string",
257
+ description: "Optional validation artifact output path.",
258
+ },
259
+ },
260
+ };
261
+ const TOOL_DEFINITIONS = [
262
+ {
263
+ name: "onto.review",
264
+ description: "Run an onto review: isolated parallel lens review followed by controlled synthesize/deliberation and ReviewRecord assembly.",
265
+ inputSchema: REVIEW_INPUT_SCHEMA,
266
+ },
267
+ {
268
+ name: "onto.prepare_review",
269
+ description: "Prepare an onto review session and prompt packets without executing lens units.",
270
+ inputSchema: REVIEW_INPUT_SCHEMA,
271
+ },
272
+ {
273
+ name: "onto.review_status",
274
+ description: "Read structured status and artifact refs for a review session.",
275
+ inputSchema: SESSION_INPUT_SCHEMA,
276
+ },
277
+ {
278
+ name: "onto.review_result",
279
+ description: "Read the ReviewRecord and rendered final output for a completed review session.",
280
+ inputSchema: SESSION_INPUT_SCHEMA,
281
+ },
282
+ {
283
+ name: "onto.list_lenses",
284
+ description: "List canonical full and core-axis review lens ids.",
285
+ inputSchema: { type: "object", additionalProperties: false, properties: {} },
286
+ },
287
+ {
288
+ name: "onto.list_domains",
289
+ description: "List available domain ids from project, user, and installation domain seats.",
290
+ inputSchema: LIST_DOMAINS_INPUT_SCHEMA,
291
+ },
292
+ {
293
+ name: "onto.list_source_profiles",
294
+ description: "List reconstruct source profiles by target_material_kind and support status.",
295
+ inputSchema: LIST_SOURCE_PROFILES_INPUT_SCHEMA,
296
+ },
297
+ {
298
+ name: "onto.observe_source",
299
+ description: "Prepare reconstruct material profiling, inventory, structural source observations, and reconstruct-record refs without generating ontology meaning.",
300
+ inputSchema: OBSERVE_SOURCE_INPUT_SCHEMA,
301
+ },
302
+ {
303
+ name: "onto.validate_reconstruct_directive",
304
+ description: "Validate LLM-authored reconstruct directive files against runtime observations and evidence refs without repairing or rewriting them.",
305
+ inputSchema: VALIDATE_RECONSTRUCT_DIRECTIVE_INPUT_SCHEMA,
306
+ },
307
+ {
308
+ name: "onto.reconstruct",
309
+ description: "Run the material-aware reconstruct happy path with explicit mock semantic author and confirmation provider realization, returning final-output.md and reconstruct-record.yaml refs.",
310
+ inputSchema: RECONSTRUCT_INPUT_SCHEMA,
311
+ },
312
+ {
313
+ name: "onto.reconstruct_status",
314
+ description: "Read structured status and artifact refs for a reconstruct session.",
315
+ inputSchema: RECONSTRUCT_SESSION_INPUT_SCHEMA,
316
+ },
317
+ {
318
+ name: "onto.reconstruct_result",
319
+ description: "Read the reconstruct record, run manifest, and final output for a reconstruct session.",
320
+ inputSchema: RECONSTRUCT_SESSION_INPUT_SCHEMA,
321
+ },
322
+ ];
323
+ async function readPackageVersion() {
324
+ return readOntoVersion();
325
+ }
326
+ function toReviewRequest(input) {
327
+ const parsed = OntoReviewToolInputSchema.parse(input);
328
+ if (parsed.deliberation !== undefined &&
329
+ parsed.deliberation !== "controlled_lens_deliberation") {
330
+ throw new Error(`Unsupported deliberation mode: ${parsed.deliberation}. MCP review supports controlled_lens_deliberation.`);
331
+ }
332
+ const request = {
333
+ projectRoot: path.resolve(parsed.projectRoot ?? process.cwd()),
334
+ target: parsed.target,
335
+ intent: parsed.intent,
336
+ ...(parsed.targetScopeKind !== undefined
337
+ ? { targetScopeKind: parsed.targetScopeKind }
338
+ : {}),
339
+ ...(parsed.primaryRef !== undefined ? { primaryRef: parsed.primaryRef } : {}),
340
+ ...(parsed.memberRefs !== undefined ? { memberRefs: parsed.memberRefs } : {}),
341
+ ...(parsed.bundleKind !== undefined ? { bundleKind: parsed.bundleKind } : {}),
342
+ ...(parsed.diffRange !== undefined ? { diffRange: parsed.diffRange } : {}),
343
+ ...(parsed.domain !== undefined ? { domain: parsed.domain } : {}),
344
+ ...(parsed.noDomain !== undefined ? { noDomain: parsed.noDomain } : {}),
345
+ ...(parsed.reviewMode !== undefined ? { reviewMode: parsed.reviewMode } : {}),
346
+ ...(parsed.lensIds !== undefined ? { lensIds: parsed.lensIds } : {}),
347
+ ...(parsed.executorRealization !== undefined
348
+ ? { executorRealization: parsed.executorRealization }
349
+ : {}),
350
+ ...(parsed.confirmValueAlignment !== undefined
351
+ ? { confirmValueAlignment: parsed.confirmValueAlignment }
352
+ : {}),
353
+ };
354
+ return request;
355
+ }
356
+ function formatToolResult(data) {
357
+ const text = JSON.stringify(data, null, 2);
358
+ return {
359
+ content: [{ type: "text", text }],
360
+ structuredContent: data,
361
+ };
362
+ }
363
+ function progressTokenFromToolCallParams(params) {
364
+ if (params === null || typeof params !== "object" || Array.isArray(params)) {
365
+ return null;
366
+ }
367
+ const meta = params._meta;
368
+ if (meta === null || typeof meta !== "object" || Array.isArray(meta)) {
369
+ return null;
370
+ }
371
+ const token = meta.progressToken;
372
+ return typeof token === "string" || typeof token === "number" ? token : null;
373
+ }
374
+ function sendMcpProgressNotification(progressToken, event) {
375
+ writeMessage({
376
+ jsonrpc: "2.0",
377
+ method: "notifications/progress",
378
+ params: {
379
+ progressToken,
380
+ progress: event.progress.current,
381
+ total: event.progress.total,
382
+ message: event.message,
383
+ _meta: {
384
+ ontoReviewProgress: event,
385
+ },
386
+ },
387
+ });
388
+ }
389
+ function structuredFailureFromError(error) {
390
+ if (error instanceof ReviewStructuredFailureError) {
391
+ return {
392
+ failure: error.failureRecord,
393
+ failureRecordPath: error.failureRecordPath,
394
+ };
395
+ }
396
+ if (error instanceof UnsupportedOntoConfigFilesError) {
397
+ return {
398
+ failure: error.failureRecord,
399
+ failureRecordPath: null,
400
+ };
401
+ }
402
+ if (error instanceof OntoSettingsValidationError) {
403
+ return {
404
+ failure: error.failureRecord,
405
+ failureRecordPath: null,
406
+ };
407
+ }
408
+ return null;
409
+ }
410
+ async function formatToolError(error) {
411
+ const message = error instanceof Error ? error.message : String(error);
412
+ const structuredFailure = structuredFailureFromError(error);
413
+ const routeVisibility = structuredFailure
414
+ ? await buildReviewRouteVisibilityFromFailure(structuredFailure.failure, structuredFailure.failureRecordPath)
415
+ : null;
416
+ return {
417
+ isError: true,
418
+ content: [{ type: "text", text: message }],
419
+ ...(structuredFailure
420
+ ? {
421
+ structuredContent: {
422
+ failure: structuredFailure.failure,
423
+ failureRecordPath: structuredFailure.failureRecordPath,
424
+ ...(routeVisibility
425
+ ? { routeVisibility: routeVisibility }
426
+ : {}),
427
+ },
428
+ }
429
+ : {}),
430
+ };
431
+ }
432
+ function isInsidePath(root, candidate) {
433
+ const relative = path.relative(path.resolve(root), path.resolve(candidate));
434
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
435
+ }
436
+ async function realpathIfExists(targetPath) {
437
+ try {
438
+ return await fs.realpath(targetPath);
439
+ }
440
+ catch {
441
+ return null;
442
+ }
443
+ }
444
+ function throwSessionDisclosureBlocked(args) {
445
+ throw new ReviewStructuredFailureError({
446
+ failureRecord: createStructuredFailureRecord({
447
+ phase: "mcp.session_disclosure",
448
+ reasonCode: args.reasonCode,
449
+ humanMessage: args.humanMessage,
450
+ requiredUserAction: "Pass a sessionRoot owned by the selected projectRoot .onto/review directory.",
451
+ retrySafety: "safe_after_input_change",
452
+ artifactTrust: "no_artifacts_trusted",
453
+ dispatchState: "not_dispatched",
454
+ artifactRefs: {},
455
+ mcpErrorCode: "ONTO_REVIEW_SECURITY_DISCLOSURE_BLOCKED",
456
+ detailsKind: "security_disclosure",
457
+ details: {
458
+ requested_session_root: args.requestedSessionRoot,
459
+ resolved_session_root: args.resolvedSessionRoot,
460
+ real_session_root: args.realSessionRoot,
461
+ project_root: args.projectRoot,
462
+ real_project_root: args.realProjectRoot,
463
+ allowed_root: args.allowedRoot,
464
+ real_allowed_root: args.realAllowedRoot,
465
+ },
466
+ }),
467
+ failureRecordPath: null,
468
+ });
469
+ }
470
+ function throwReconstructSessionDisclosureBlocked(args) {
471
+ throw new ReviewStructuredFailureError({
472
+ failureRecord: createStructuredFailureRecord({
473
+ phase: "mcp.reconstruct_session_disclosure",
474
+ reasonCode: args.reasonCode,
475
+ humanMessage: args.humanMessage,
476
+ requiredUserAction: "Pass a sessionRoot owned by the selected projectRoot .onto/reconstruct directory.",
477
+ retrySafety: "safe_after_input_change",
478
+ artifactTrust: "no_artifacts_trusted",
479
+ dispatchState: "not_dispatched",
480
+ artifactRefs: {},
481
+ mcpErrorCode: "ONTO_RECONSTRUCT_SECURITY_DISCLOSURE_BLOCKED",
482
+ detailsKind: "security_disclosure",
483
+ details: {
484
+ requested_session_root: args.requestedSessionRoot,
485
+ resolved_session_root: args.resolvedSessionRoot,
486
+ real_session_root: args.realSessionRoot,
487
+ project_root: args.projectRoot,
488
+ real_project_root: args.realProjectRoot,
489
+ allowed_root: args.allowedRoot,
490
+ real_allowed_root: args.realAllowedRoot,
491
+ ...(args.details ?? {}),
492
+ },
493
+ }),
494
+ failureRecordPath: null,
495
+ });
496
+ }
497
+ async function resolveAllowedSessionRoot(args) {
498
+ const projectRoot = path.resolve(args.projectRoot ?? process.cwd());
499
+ const allowedRoot = path.join(projectRoot, ".onto", "review");
500
+ const resolvedSessionRoot = path.resolve(projectRoot, args.sessionRoot);
501
+ const realProjectRoot = await realpathIfExists(projectRoot);
502
+ const realAllowedRoot = await realpathIfExists(allowedRoot);
503
+ if (!isInsidePath(allowedRoot, resolvedSessionRoot)) {
504
+ throwSessionDisclosureBlocked({
505
+ requestedSessionRoot: args.sessionRoot,
506
+ resolvedSessionRoot,
507
+ realSessionRoot: null,
508
+ projectRoot,
509
+ realProjectRoot,
510
+ allowedRoot,
511
+ realAllowedRoot,
512
+ reasonCode: "review_session_root_outside_project_boundary",
513
+ humanMessage: "MCP review session read was blocked because the sessionRoot is outside the project review boundary.",
514
+ });
515
+ }
516
+ const realSessionRoot = await realpathIfExists(resolvedSessionRoot);
517
+ if (realSessionRoot &&
518
+ realAllowedRoot &&
519
+ !isInsidePath(realAllowedRoot, realSessionRoot)) {
520
+ throwSessionDisclosureBlocked({
521
+ requestedSessionRoot: args.sessionRoot,
522
+ resolvedSessionRoot,
523
+ realSessionRoot,
524
+ projectRoot,
525
+ realProjectRoot,
526
+ allowedRoot,
527
+ realAllowedRoot,
528
+ reasonCode: "review_session_root_realpath_escape",
529
+ humanMessage: "MCP review session read was blocked because the sessionRoot realpath escapes the project review boundary.",
530
+ });
531
+ }
532
+ const canonicalSessionRoot = realSessionRoot ?? resolvedSessionRoot;
533
+ const metadataPath = path.join(canonicalSessionRoot, "session-metadata.yaml");
534
+ if (await fileExists(metadataPath)) {
535
+ const metadata = await readYamlDocument(metadataPath);
536
+ const recordedProjectRoot = typeof metadata.project_root === "string"
537
+ ? path.resolve(metadata.project_root)
538
+ : null;
539
+ const realRecordedProjectRoot = recordedProjectRoot
540
+ ? await realpathIfExists(recordedProjectRoot)
541
+ : null;
542
+ const projectRootForComparison = realProjectRoot ?? projectRoot;
543
+ const recordedForComparison = realRecordedProjectRoot ?? recordedProjectRoot;
544
+ if (!recordedForComparison ||
545
+ path.resolve(recordedForComparison) !== path.resolve(projectRootForComparison)) {
546
+ throwSessionDisclosureBlocked({
547
+ requestedSessionRoot: args.sessionRoot,
548
+ resolvedSessionRoot,
549
+ realSessionRoot,
550
+ projectRoot,
551
+ realProjectRoot,
552
+ allowedRoot,
553
+ realAllowedRoot,
554
+ reasonCode: "review_session_root_project_owner_mismatch",
555
+ humanMessage: "MCP review session read was blocked because the session metadata is owned by a different projectRoot.",
556
+ });
557
+ }
558
+ }
559
+ return canonicalSessionRoot;
560
+ }
561
+ function resolveProjectRoot(projectRoot) {
562
+ return path.resolve(projectRoot ?? process.cwd());
563
+ }
564
+ function resolveInsideProject(args) {
565
+ const resolved = path.isAbsolute(args.ref)
566
+ ? path.resolve(args.ref)
567
+ : path.resolve(args.projectRoot, args.ref);
568
+ if (!isInsidePath(args.projectRoot, resolved)) {
569
+ throw new Error(`${args.label} must stay inside projectRoot.`);
570
+ }
571
+ return resolved;
572
+ }
573
+ function resolveReconstructSessionRoot(args) {
574
+ if (!args.sessionRoot)
575
+ return undefined;
576
+ const allowedRoot = path.join(args.projectRoot, ".onto", "reconstruct");
577
+ const resolved = path.isAbsolute(args.sessionRoot)
578
+ ? path.resolve(args.sessionRoot)
579
+ : path.resolve(args.projectRoot, args.sessionRoot);
580
+ if (!isInsidePath(allowedRoot, resolved)) {
581
+ throw new Error("sessionRoot must stay inside projectRoot/.onto/reconstruct.");
582
+ }
583
+ return resolved;
584
+ }
585
+ function resolveRequiredReconstructSessionRoot(args) {
586
+ const resolved = resolveReconstructSessionRoot(args);
587
+ if (!resolved) {
588
+ throw new Error("sessionRoot is required.");
589
+ }
590
+ return resolved;
591
+ }
592
+ async function resolveAllowedReconstructSessionRoot(args) {
593
+ const projectRoot = path.resolve(args.projectRoot);
594
+ const allowedRoot = path.join(projectRoot, ".onto", "reconstruct");
595
+ const resolvedSessionRoot = path.isAbsolute(args.sessionRoot)
596
+ ? path.resolve(args.sessionRoot)
597
+ : path.resolve(projectRoot, args.sessionRoot);
598
+ const realProjectRoot = await realpathIfExists(projectRoot);
599
+ const realAllowedRoot = await realpathIfExists(allowedRoot);
600
+ if (!isInsidePath(allowedRoot, resolvedSessionRoot)) {
601
+ throwReconstructSessionDisclosureBlocked({
602
+ requestedSessionRoot: args.sessionRoot,
603
+ resolvedSessionRoot,
604
+ realSessionRoot: null,
605
+ projectRoot,
606
+ realProjectRoot,
607
+ allowedRoot,
608
+ realAllowedRoot,
609
+ reasonCode: "reconstruct_session_root_outside_project_boundary",
610
+ humanMessage: "MCP reconstruct session read was blocked because the sessionRoot is outside the project reconstruct boundary.",
611
+ });
612
+ }
613
+ const realSessionRoot = await realpathIfExists(resolvedSessionRoot);
614
+ if (realSessionRoot &&
615
+ realAllowedRoot &&
616
+ !isInsidePath(realAllowedRoot, realSessionRoot)) {
617
+ throwReconstructSessionDisclosureBlocked({
618
+ requestedSessionRoot: args.sessionRoot,
619
+ resolvedSessionRoot,
620
+ realSessionRoot,
621
+ projectRoot,
622
+ realProjectRoot,
623
+ allowedRoot,
624
+ realAllowedRoot,
625
+ reasonCode: "reconstruct_session_root_realpath_escape",
626
+ humanMessage: "MCP reconstruct session read was blocked because the sessionRoot realpath escapes the project reconstruct boundary.",
627
+ });
628
+ }
629
+ const canonicalSessionRoot = realSessionRoot ?? resolvedSessionRoot;
630
+ const recordPath = path.join(canonicalSessionRoot, "reconstruct-record.yaml");
631
+ if (await fileExists(recordPath)) {
632
+ const record = await readYamlDocument(recordPath);
633
+ if (record.session_id !== path.basename(canonicalSessionRoot)) {
634
+ throwReconstructSessionDisclosureBlocked({
635
+ requestedSessionRoot: args.sessionRoot,
636
+ resolvedSessionRoot,
637
+ realSessionRoot,
638
+ projectRoot,
639
+ realProjectRoot,
640
+ allowedRoot,
641
+ realAllowedRoot,
642
+ reasonCode: "reconstruct_session_record_owner_mismatch",
643
+ humanMessage: "MCP reconstruct session read was blocked because the reconstruct record is owned by a different session.",
644
+ details: {
645
+ record_session_id: typeof record.session_id === "string" ? record.session_id : null,
646
+ expected_session_id: path.basename(canonicalSessionRoot),
647
+ },
648
+ });
649
+ }
650
+ for (const [artifactKey, artifactRef] of Object.entries(record.artifact_refs ?? {})) {
651
+ if (typeof artifactRef !== "string" || artifactRef.length === 0)
652
+ continue;
653
+ const resolvedArtifactRef = path.resolve(artifactRef);
654
+ if (!isInsidePath(resolvedSessionRoot, resolvedArtifactRef)) {
655
+ throwReconstructSessionDisclosureBlocked({
656
+ requestedSessionRoot: args.sessionRoot,
657
+ resolvedSessionRoot,
658
+ realSessionRoot,
659
+ projectRoot,
660
+ realProjectRoot,
661
+ allowedRoot,
662
+ realAllowedRoot,
663
+ reasonCode: "reconstruct_artifact_ref_outside_session_boundary",
664
+ humanMessage: "MCP reconstruct session read was blocked because an artifact ref escapes the session boundary.",
665
+ details: {
666
+ artifact_key: artifactKey,
667
+ artifact_ref: resolvedArtifactRef,
668
+ },
669
+ });
670
+ }
671
+ const realArtifactRef = await realpathIfExists(resolvedArtifactRef);
672
+ if (realArtifactRef &&
673
+ realSessionRoot &&
674
+ !isInsidePath(realSessionRoot, realArtifactRef)) {
675
+ throwReconstructSessionDisclosureBlocked({
676
+ requestedSessionRoot: args.sessionRoot,
677
+ resolvedSessionRoot,
678
+ realSessionRoot,
679
+ projectRoot,
680
+ realProjectRoot,
681
+ allowedRoot,
682
+ realAllowedRoot,
683
+ reasonCode: "reconstruct_artifact_ref_realpath_escape",
684
+ humanMessage: "MCP reconstruct session read was blocked because an artifact ref realpath escapes the session boundary.",
685
+ details: {
686
+ artifact_key: artifactKey,
687
+ artifact_ref: resolvedArtifactRef,
688
+ real_artifact_ref: realArtifactRef,
689
+ },
690
+ });
691
+ }
692
+ }
693
+ }
694
+ return canonicalSessionRoot;
695
+ }
696
+ async function callTool(name, args, options = {}) {
697
+ try {
698
+ switch (name) {
699
+ case "onto.review": {
700
+ const parsed = OntoReviewToolInputSchema.parse(args);
701
+ if (parsed.prepareOnly) {
702
+ const prepared = await reviewApi.prepareReview(toReviewRequest(parsed));
703
+ return formatToolResult(prepared);
704
+ }
705
+ const request = toReviewRequest(parsed);
706
+ const progressToken = options.progressToken;
707
+ const result = await reviewApi.runReview({
708
+ ...request,
709
+ ...(progressToken !== undefined && progressToken !== null
710
+ ? {
711
+ progressObserver: (event) => sendMcpProgressNotification(progressToken, event),
712
+ }
713
+ : {}),
714
+ });
715
+ return formatToolResult(result);
716
+ }
717
+ case "onto.prepare_review": {
718
+ const parsed = OntoPrepareReviewToolInputSchema.parse(args);
719
+ const result = await reviewApi.prepareReview(toReviewRequest(parsed));
720
+ return formatToolResult(result);
721
+ }
722
+ case "onto.review_status": {
723
+ const parsed = OntoReviewSessionInputSchema.parse(args);
724
+ const sessionRoot = await resolveAllowedSessionRoot(parsed);
725
+ return formatToolResult(await reviewApi.getReviewStatus(sessionRoot));
726
+ }
727
+ case "onto.review_result": {
728
+ const parsed = OntoReviewSessionInputSchema.parse(args);
729
+ const sessionRoot = await resolveAllowedSessionRoot(parsed);
730
+ return formatToolResult(await reviewApi.getReviewResult(sessionRoot));
731
+ }
732
+ case "onto.list_lenses":
733
+ return formatToolResult(await reviewApi.listLenses());
734
+ case "onto.list_domains": {
735
+ const parsed = OntoListDomainsToolInputSchema.parse(args ?? {});
736
+ return formatToolResult(await reviewApi.listDomains(parsed.projectRoot));
737
+ }
738
+ case "onto.list_source_profiles": {
739
+ const parsed = OntoListSourceProfilesToolInputSchema.parse(args ?? {});
740
+ return formatToolResult(await reconstructApi.listSourceProfiles(parsed.projectRoot));
741
+ }
742
+ case "onto.observe_source": {
743
+ const parsed = OntoObserveSourceToolInputSchema.parse(args);
744
+ const projectRoot = resolveProjectRoot(parsed.projectRoot);
745
+ const sessionRoot = resolveReconstructSessionRoot({
746
+ projectRoot,
747
+ ...(parsed.sessionRoot ? { sessionRoot: parsed.sessionRoot } : {}),
748
+ });
749
+ const targetRefs = parsed.targetRefs.map((targetRef) => resolveInsideProject({
750
+ projectRoot,
751
+ ref: targetRef,
752
+ label: "targetRefs[]",
753
+ }));
754
+ const filesystemAllowedRoots = parsed.filesystemAllowedRoots?.map((root) => resolveInsideProject({
755
+ projectRoot,
756
+ ref: root,
757
+ label: "filesystemAllowedRoots[]",
758
+ }));
759
+ const profilesRoot = parsed.profilesRoot
760
+ ? resolveInsideProject({
761
+ projectRoot,
762
+ ref: parsed.profilesRoot,
763
+ label: "profilesRoot",
764
+ })
765
+ : undefined;
766
+ return formatToolResult(await reconstructApi.prepareReconstruct({
767
+ projectRoot,
768
+ targetRefs,
769
+ ...(sessionRoot ? { sessionRoot } : {}),
770
+ ...(profilesRoot ? { profilesRoot } : {}),
771
+ ...(filesystemAllowedRoots ? { filesystemAllowedRoots } : {}),
772
+ }));
773
+ }
774
+ case "onto.validate_reconstruct_directive": {
775
+ const parsed = OntoValidateReconstructDirectiveToolInputSchema.parse(args);
776
+ const projectRoot = resolveProjectRoot(parsed.projectRoot);
777
+ const sourceObservationsPath = resolveInsideProject({
778
+ projectRoot,
779
+ ref: parsed.sourceObservationsPath,
780
+ label: "sourceObservationsPath",
781
+ });
782
+ const outputPath = parsed.outputPath
783
+ ? resolveInsideProject({
784
+ projectRoot,
785
+ ref: parsed.outputPath,
786
+ label: "outputPath",
787
+ })
788
+ : undefined;
789
+ if (parsed.directiveKind === "source_observation") {
790
+ return formatToolResult(await reconstructApi.validateSourceObservationDirective({
791
+ directivePath: resolveInsideProject({
792
+ projectRoot,
793
+ ref: parsed.directivePath,
794
+ label: "directivePath",
795
+ }),
796
+ sourceObservationsPath,
797
+ ...(outputPath ? { outputPath } : {}),
798
+ }));
799
+ }
800
+ return formatToolResult(await reconstructApi.validateSeedCandidate({
801
+ seedCandidatePath: resolveInsideProject({
802
+ projectRoot,
803
+ ref: parsed.seedCandidatePath,
804
+ label: "seedCandidatePath",
805
+ }),
806
+ sourceObservationsPath,
807
+ ...(parsed.sourceObservationDirectivePath
808
+ ? {
809
+ sourceObservationDirectivePath: resolveInsideProject({
810
+ projectRoot,
811
+ ref: parsed.sourceObservationDirectivePath,
812
+ label: "sourceObservationDirectivePath",
813
+ }),
814
+ }
815
+ : {}),
816
+ ...(parsed.sourceObservationDirectiveValidationPath
817
+ ? {
818
+ sourceObservationDirectiveValidationPath: resolveInsideProject({
819
+ projectRoot,
820
+ ref: parsed.sourceObservationDirectiveValidationPath,
821
+ label: "sourceObservationDirectiveValidationPath",
822
+ }),
823
+ }
824
+ : {}),
825
+ ...(outputPath ? { outputPath } : {}),
826
+ }));
827
+ }
828
+ case "onto.reconstruct": {
829
+ const parsed = OntoReconstructToolInputSchema.parse(args);
830
+ const projectRoot = resolveProjectRoot(parsed.projectRoot);
831
+ const sessionRoot = resolveReconstructSessionRoot({
832
+ projectRoot,
833
+ ...(parsed.sessionRoot ? { sessionRoot: parsed.sessionRoot } : {}),
834
+ });
835
+ const targetRefs = parsed.targetRefs.map((targetRef) => resolveInsideProject({
836
+ projectRoot,
837
+ ref: targetRef,
838
+ label: "targetRefs[]",
839
+ }));
840
+ const filesystemAllowedRoots = parsed.filesystemAllowedRoots?.map((root) => resolveInsideProject({
841
+ projectRoot,
842
+ ref: root,
843
+ label: "filesystemAllowedRoots[]",
844
+ }));
845
+ const profilesRoot = parsed.profilesRoot
846
+ ? resolveInsideProject({
847
+ projectRoot,
848
+ ref: parsed.profilesRoot,
849
+ label: "profilesRoot",
850
+ })
851
+ : undefined;
852
+ return formatToolResult(await reconstructApi.runReconstruct({
853
+ projectRoot,
854
+ targetRefs,
855
+ intent: parsed.intent,
856
+ semanticAuthorRealization: parsed.semanticAuthorRealization,
857
+ confirmationProviderRealization: parsed.confirmationProviderRealization,
858
+ ...(sessionRoot ? { sessionRoot } : {}),
859
+ ...(profilesRoot ? { profilesRoot } : {}),
860
+ ...(filesystemAllowedRoots ? { filesystemAllowedRoots } : {}),
861
+ }));
862
+ }
863
+ case "onto.reconstruct_status": {
864
+ const parsed = OntoReconstructSessionInputSchema.parse(args);
865
+ const projectRoot = resolveProjectRoot(parsed.projectRoot);
866
+ const sessionRoot = await resolveAllowedReconstructSessionRoot({
867
+ projectRoot,
868
+ sessionRoot: parsed.sessionRoot,
869
+ });
870
+ return formatToolResult(await reconstructApi.getRunStatus(sessionRoot));
871
+ }
872
+ case "onto.reconstruct_result": {
873
+ const parsed = OntoReconstructSessionInputSchema.parse(args);
874
+ const projectRoot = resolveProjectRoot(parsed.projectRoot);
875
+ const sessionRoot = await resolveAllowedReconstructSessionRoot({
876
+ projectRoot,
877
+ sessionRoot: parsed.sessionRoot,
878
+ });
879
+ return formatToolResult(await reconstructApi.getRunResult(sessionRoot));
880
+ }
881
+ default:
882
+ return formatToolError(`Unknown tool: ${name}`);
883
+ }
884
+ }
885
+ catch (error) {
886
+ return formatToolError(error);
887
+ }
888
+ }
889
+ function jsonRpcResult(id, result) {
890
+ return {
891
+ jsonrpc: "2.0",
892
+ id: id ?? null,
893
+ result,
894
+ };
895
+ }
896
+ function jsonRpcError(id, code, message) {
897
+ return {
898
+ jsonrpc: "2.0",
899
+ id: id ?? null,
900
+ error: { code, message },
901
+ };
902
+ }
903
+ async function handleRequest(message) {
904
+ if (!message.id && message.method?.startsWith("notifications/")) {
905
+ return null;
906
+ }
907
+ switch (message.method) {
908
+ case "initialize":
909
+ return jsonRpcResult(message.id, {
910
+ protocolVersion: "2024-11-05",
911
+ capabilities: { tools: {} },
912
+ serverInfo: {
913
+ name: "onto-mcp",
914
+ version: await readPackageVersion(),
915
+ },
916
+ });
917
+ case "ping":
918
+ return jsonRpcResult(message.id, {});
919
+ case "tools/list":
920
+ return jsonRpcResult(message.id, { tools: TOOL_DEFINITIONS });
921
+ case "tools/call": {
922
+ const params = message.params;
923
+ if (!params || typeof params.name !== "string") {
924
+ return jsonRpcError(message.id, -32602, "tools/call requires params.name.");
925
+ }
926
+ return jsonRpcResult(message.id, await callTool(params.name, params.arguments ?? {}, {
927
+ progressToken: progressTokenFromToolCallParams(params),
928
+ }));
929
+ }
930
+ default:
931
+ return jsonRpcError(message.id, -32601, `Method not found: ${message.method ?? "(missing)"}`);
932
+ }
933
+ }
934
+ function writeMessage(message) {
935
+ const body = JSON.stringify(message);
936
+ process.stdout.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`);
937
+ }
938
+ function headerEndIndex(buffer) {
939
+ const crlf = buffer.indexOf("\r\n\r\n");
940
+ if (crlf >= 0)
941
+ return { index: crlf, length: 4 };
942
+ const lf = buffer.indexOf("\n\n");
943
+ if (lf >= 0)
944
+ return { index: lf, length: 2 };
945
+ return null;
946
+ }
947
+ function parseContentLength(header) {
948
+ const match = /^Content-Length:\s*(\d+)\s*$/im.exec(header);
949
+ if (!match?.[1]) {
950
+ throw new Error("Missing Content-Length header.");
951
+ }
952
+ return Number.parseInt(match[1], 10);
953
+ }
954
+ export async function startMcpServer() {
955
+ let buffer = Buffer.alloc(0);
956
+ let chain = Promise.resolve();
957
+ process.stdin.on("data", (chunk) => {
958
+ buffer = Buffer.concat([buffer, chunk]);
959
+ while (true) {
960
+ const headerEnd = headerEndIndex(buffer);
961
+ if (!headerEnd)
962
+ return;
963
+ const header = buffer.subarray(0, headerEnd.index).toString("utf8");
964
+ let contentLength;
965
+ try {
966
+ contentLength = parseContentLength(header);
967
+ }
968
+ catch (error) {
969
+ writeMessage(jsonRpcError(null, -32700, error instanceof Error ? error.message : String(error)));
970
+ buffer = Buffer.alloc(0);
971
+ return;
972
+ }
973
+ const totalLength = headerEnd.index + headerEnd.length + contentLength;
974
+ if (buffer.length < totalLength)
975
+ return;
976
+ const body = buffer
977
+ .subarray(headerEnd.index + headerEnd.length, totalLength)
978
+ .toString("utf8");
979
+ buffer = buffer.subarray(totalLength);
980
+ chain = chain.then(async () => {
981
+ let request;
982
+ try {
983
+ request = JSON.parse(body);
984
+ }
985
+ catch (error) {
986
+ writeMessage(jsonRpcError(null, -32700, error instanceof Error ? error.message : String(error)));
987
+ return;
988
+ }
989
+ const response = await handleRequest(request);
990
+ if (response)
991
+ writeMessage(response);
992
+ }).catch((error) => {
993
+ process.stderr.write(`[onto-mcp] request failed: ${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
994
+ });
995
+ }
996
+ });
997
+ await new Promise((resolve) => {
998
+ process.stdin.on("end", resolve);
999
+ });
1000
+ await chain;
1001
+ return 0;
1002
+ }
1003
+ async function main() {
1004
+ return startMcpServer();
1005
+ }
1006
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
1007
+ main().then((exitCode) => process.exit(exitCode), (error) => {
1008
+ process.stderr.write(error instanceof Error ? `${error.message}\n` : `${String(error)}\n`);
1009
+ process.exit(1);
1010
+ });
1011
+ }