@cleocode/mcp-server 0.86.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 (374) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/domains/index.d.ts +16 -0
  4. package/dist/domains/index.d.ts.map +1 -0
  5. package/dist/domains/index.js +16 -0
  6. package/dist/domains/index.js.map +1 -0
  7. package/dist/domains/lifecycle.d.ts +147 -0
  8. package/dist/domains/lifecycle.d.ts.map +1 -0
  9. package/dist/domains/lifecycle.js +452 -0
  10. package/dist/domains/lifecycle.js.map +1 -0
  11. package/dist/domains/orchestrate.d.ts +133 -0
  12. package/dist/domains/orchestrate.d.ts.map +1 -0
  13. package/dist/domains/orchestrate.js +465 -0
  14. package/dist/domains/orchestrate.js.map +1 -0
  15. package/dist/domains/release.d.ts +109 -0
  16. package/dist/domains/release.d.ts.map +1 -0
  17. package/dist/domains/release.js +400 -0
  18. package/dist/domains/release.js.map +1 -0
  19. package/dist/domains/research.d.ts +139 -0
  20. package/dist/domains/research.d.ts.map +1 -0
  21. package/dist/domains/research.js +606 -0
  22. package/dist/domains/research.js.map +1 -0
  23. package/dist/domains/session.d.ts +129 -0
  24. package/dist/domains/session.d.ts.map +1 -0
  25. package/dist/domains/session.js +433 -0
  26. package/dist/domains/session.js.map +1 -0
  27. package/dist/domains/system.d.ts +92 -0
  28. package/dist/domains/system.d.ts.map +1 -0
  29. package/dist/domains/system.js +473 -0
  30. package/dist/domains/system.js.map +1 -0
  31. package/dist/domains/tasks.d.ts +180 -0
  32. package/dist/domains/tasks.d.ts.map +1 -0
  33. package/dist/domains/tasks.js +704 -0
  34. package/dist/domains/tasks.js.map +1 -0
  35. package/dist/domains/validate.d.ts +150 -0
  36. package/dist/domains/validate.d.ts.map +1 -0
  37. package/dist/domains/validate.js +568 -0
  38. package/dist/domains/validate.js.map +1 -0
  39. package/dist/gateways/mutate.d.ts +100 -0
  40. package/dist/gateways/mutate.d.ts.map +1 -0
  41. package/dist/gateways/mutate.js +937 -0
  42. package/dist/gateways/mutate.js.map +1 -0
  43. package/dist/gateways/query.d.ts +91 -0
  44. package/dist/gateways/query.d.ts.map +1 -0
  45. package/dist/gateways/query.js +245 -0
  46. package/dist/gateways/query.js.map +1 -0
  47. package/dist/index.d.ts +21 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +299 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lib/audit.d.ts +118 -0
  52. package/dist/lib/audit.d.ts.map +1 -0
  53. package/dist/lib/audit.js +311 -0
  54. package/dist/lib/audit.js.map +1 -0
  55. package/dist/lib/background-jobs.d.ts +86 -0
  56. package/dist/lib/background-jobs.d.ts.map +1 -0
  57. package/dist/lib/background-jobs.js +183 -0
  58. package/dist/lib/background-jobs.js.map +1 -0
  59. package/dist/lib/cache.d.ts +78 -0
  60. package/dist/lib/cache.d.ts.map +1 -0
  61. package/dist/lib/cache.js +204 -0
  62. package/dist/lib/cache.js.map +1 -0
  63. package/dist/lib/command-builder.d.ts +52 -0
  64. package/dist/lib/command-builder.d.ts.map +1 -0
  65. package/dist/lib/command-builder.js +280 -0
  66. package/dist/lib/command-builder.js.map +1 -0
  67. package/dist/lib/config.d.ts +42 -0
  68. package/dist/lib/config.d.ts.map +1 -0
  69. package/dist/lib/config.js +248 -0
  70. package/dist/lib/config.js.map +1 -0
  71. package/dist/lib/defaults.d.ts +115 -0
  72. package/dist/lib/defaults.d.ts.map +1 -0
  73. package/dist/lib/defaults.js +61 -0
  74. package/dist/lib/defaults.js.map +1 -0
  75. package/dist/lib/error-handler.d.ts +101 -0
  76. package/dist/lib/error-handler.d.ts.map +1 -0
  77. package/dist/lib/error-handler.js +277 -0
  78. package/dist/lib/error-handler.js.map +1 -0
  79. package/dist/lib/executor.d.ts +110 -0
  80. package/dist/lib/executor.d.ts.map +1 -0
  81. package/dist/lib/executor.js +362 -0
  82. package/dist/lib/executor.js.map +1 -0
  83. package/dist/lib/exit-codes.d.ts +190 -0
  84. package/dist/lib/exit-codes.d.ts.map +1 -0
  85. package/dist/lib/exit-codes.js +1027 -0
  86. package/dist/lib/exit-codes.js.map +1 -0
  87. package/dist/lib/formatter.d.ts +196 -0
  88. package/dist/lib/formatter.d.ts.map +1 -0
  89. package/dist/lib/formatter.js +260 -0
  90. package/dist/lib/formatter.js.map +1 -0
  91. package/dist/lib/gate-validators.d.ts +103 -0
  92. package/dist/lib/gate-validators.d.ts.map +1 -0
  93. package/dist/lib/gate-validators.js +689 -0
  94. package/dist/lib/gate-validators.js.map +1 -0
  95. package/dist/lib/manifest-parser.d.ts +61 -0
  96. package/dist/lib/manifest-parser.d.ts.map +1 -0
  97. package/dist/lib/manifest-parser.js +338 -0
  98. package/dist/lib/manifest-parser.js.map +1 -0
  99. package/dist/lib/manifest.d.ts +177 -0
  100. package/dist/lib/manifest.d.ts.map +1 -0
  101. package/dist/lib/manifest.js +301 -0
  102. package/dist/lib/manifest.js.map +1 -0
  103. package/dist/lib/protocol-enforcement.d.ts +105 -0
  104. package/dist/lib/protocol-enforcement.d.ts.map +1 -0
  105. package/dist/lib/protocol-enforcement.js +331 -0
  106. package/dist/lib/protocol-enforcement.js.map +1 -0
  107. package/dist/lib/protocol-rules.d.ts +55 -0
  108. package/dist/lib/protocol-rules.d.ts.map +1 -0
  109. package/dist/lib/protocol-rules.js +760 -0
  110. package/dist/lib/protocol-rules.js.map +1 -0
  111. package/dist/lib/rate-limiter.d.ts +110 -0
  112. package/dist/lib/rate-limiter.d.ts.map +1 -0
  113. package/dist/lib/rate-limiter.js +208 -0
  114. package/dist/lib/rate-limiter.js.map +1 -0
  115. package/dist/lib/router.d.ts +126 -0
  116. package/dist/lib/router.d.ts.map +1 -0
  117. package/dist/lib/router.js +276 -0
  118. package/dist/lib/router.js.map +1 -0
  119. package/dist/lib/schema.d.ts +55 -0
  120. package/dist/lib/schema.d.ts.map +1 -0
  121. package/dist/lib/schema.js +70 -0
  122. package/dist/lib/schema.js.map +1 -0
  123. package/dist/lib/security.d.ts +156 -0
  124. package/dist/lib/security.d.ts.map +1 -0
  125. package/dist/lib/security.js +347 -0
  126. package/dist/lib/security.js.map +1 -0
  127. package/dist/lib/verification-gates.d.ts +287 -0
  128. package/dist/lib/verification-gates.d.ts.map +1 -0
  129. package/dist/lib/verification-gates.js +548 -0
  130. package/dist/lib/verification-gates.js.map +1 -0
  131. package/dist/types/domain.d.ts +29 -0
  132. package/dist/types/domain.d.ts.map +1 -0
  133. package/dist/types/domain.js +7 -0
  134. package/dist/types/domain.js.map +1 -0
  135. package/dist/types/error.d.ts +101 -0
  136. package/dist/types/error.d.ts.map +1 -0
  137. package/dist/types/error.js +61 -0
  138. package/dist/types/error.js.map +1 -0
  139. package/dist/types/gateway.d.ts +78 -0
  140. package/dist/types/gateway.d.ts.map +1 -0
  141. package/dist/types/gateway.js +7 -0
  142. package/dist/types/gateway.js.map +1 -0
  143. package/dist/types/index.d.ts +21 -0
  144. package/dist/types/index.d.ts.map +1 -0
  145. package/dist/types/index.js +11 -0
  146. package/dist/types/index.js.map +1 -0
  147. package/dist/types/operations/lifecycle.d.ts +140 -0
  148. package/dist/types/operations/lifecycle.d.ts.map +1 -0
  149. package/dist/types/operations/lifecycle.js +8 -0
  150. package/dist/types/operations/lifecycle.js.map +1 -0
  151. package/dist/types/operations/orchestrate.d.ts +140 -0
  152. package/dist/types/operations/orchestrate.d.ts.map +1 -0
  153. package/dist/types/operations/orchestrate.js +8 -0
  154. package/dist/types/operations/orchestrate.js.map +1 -0
  155. package/dist/types/operations/release.d.ts +97 -0
  156. package/dist/types/operations/release.d.ts.map +1 -0
  157. package/dist/types/operations/release.js +7 -0
  158. package/dist/types/operations/release.js.map +1 -0
  159. package/dist/types/operations/research.d.ts +122 -0
  160. package/dist/types/operations/research.d.ts.map +1 -0
  161. package/dist/types/operations/research.js +8 -0
  162. package/dist/types/operations/research.js.map +1 -0
  163. package/dist/types/operations/session.d.ts +108 -0
  164. package/dist/types/operations/session.d.ts.map +1 -0
  165. package/dist/types/operations/session.js +8 -0
  166. package/dist/types/operations/session.js.map +1 -0
  167. package/dist/types/operations/system.d.ts +147 -0
  168. package/dist/types/operations/system.d.ts.map +1 -0
  169. package/dist/types/operations/system.js +8 -0
  170. package/dist/types/operations/system.js.map +1 -0
  171. package/dist/types/operations/tasks.d.ts +186 -0
  172. package/dist/types/operations/tasks.d.ts.map +1 -0
  173. package/dist/types/operations/tasks.js +8 -0
  174. package/dist/types/operations/tasks.js.map +1 -0
  175. package/dist/types/operations/validate.d.ts +170 -0
  176. package/dist/types/operations/validate.d.ts.map +1 -0
  177. package/dist/types/operations/validate.js +8 -0
  178. package/dist/types/operations/validate.js.map +1 -0
  179. package/package.json +67 -0
  180. package/schemas/IMPLEMENTATION-SUMMARY.md +250 -0
  181. package/schemas/README.md +284 -0
  182. package/schemas/common/error.schema.json +54 -0
  183. package/schemas/common/meta.schema.json +39 -0
  184. package/schemas/common/pagination.schema.json +32 -0
  185. package/schemas/index.json +159 -0
  186. package/schemas/requests/lifecycle/check.schema.json +20 -0
  187. package/schemas/requests/lifecycle/gate.fail.schema.json +25 -0
  188. package/schemas/requests/lifecycle/gate.pass.schema.json +28 -0
  189. package/schemas/requests/lifecycle/gates.schema.json +15 -0
  190. package/schemas/requests/lifecycle/history.schema.json +15 -0
  191. package/schemas/requests/lifecycle/prerequisites.schema.json +15 -0
  192. package/schemas/requests/lifecycle/progress.schema.json +29 -0
  193. package/schemas/requests/lifecycle/reset.schema.json +25 -0
  194. package/schemas/requests/lifecycle/skip.schema.json +25 -0
  195. package/schemas/requests/lifecycle/status.schema.json +23 -0
  196. package/schemas/requests/orchestrate/analyze.schema.json +15 -0
  197. package/schemas/requests/orchestrate/context.schema.json +13 -0
  198. package/schemas/requests/orchestrate/next.schema.json +15 -0
  199. package/schemas/requests/orchestrate/parallel.end.schema.json +20 -0
  200. package/schemas/requests/orchestrate/parallel.start.schema.json +20 -0
  201. package/schemas/requests/orchestrate/ready.schema.json +15 -0
  202. package/schemas/requests/orchestrate/skill.list.schema.json +13 -0
  203. package/schemas/requests/orchestrate/spawn.schema.json +25 -0
  204. package/schemas/requests/orchestrate/startup.schema.json +15 -0
  205. package/schemas/requests/orchestrate/status.schema.json +15 -0
  206. package/schemas/requests/orchestrate/validate.schema.json +15 -0
  207. package/schemas/requests/orchestrate/waves.schema.json +15 -0
  208. package/schemas/requests/release/changelog.schema.json +23 -0
  209. package/schemas/requests/release/commit.schema.json +22 -0
  210. package/schemas/requests/release/gates.run.schema.json +17 -0
  211. package/schemas/requests/release/prepare.schema.json +20 -0
  212. package/schemas/requests/release/push.schema.json +20 -0
  213. package/schemas/requests/release/rollback.schema.json +20 -0
  214. package/schemas/requests/release/tag.schema.json +19 -0
  215. package/schemas/requests/research/inject.schema.json +24 -0
  216. package/schemas/requests/research/link.schema.json +25 -0
  217. package/schemas/requests/research/list.schema.json +19 -0
  218. package/schemas/requests/research/manifest.append.schema.json +20 -0
  219. package/schemas/requests/research/manifest.archive.schema.json +19 -0
  220. package/schemas/requests/research/manifest.read.schema.json +21 -0
  221. package/schemas/requests/research/pending.schema.json +14 -0
  222. package/schemas/requests/research/query.schema.json +21 -0
  223. package/schemas/requests/research/show.schema.json +14 -0
  224. package/schemas/requests/research/stats.schema.json +14 -0
  225. package/schemas/requests/session/end.schema.json +13 -0
  226. package/schemas/requests/session/focus.clear.schema.json +7 -0
  227. package/schemas/requests/session/focus.get.schema.json +7 -0
  228. package/schemas/requests/session/focus.set.schema.json +15 -0
  229. package/schemas/requests/session/gc.schema.json +14 -0
  230. package/schemas/requests/session/history.schema.json +16 -0
  231. package/schemas/requests/session/list.schema.json +13 -0
  232. package/schemas/requests/session/resume.schema.json +14 -0
  233. package/schemas/requests/session/show.schema.json +14 -0
  234. package/schemas/requests/session/start.schema.json +23 -0
  235. package/schemas/requests/session/status.schema.json +7 -0
  236. package/schemas/requests/session/suspend.schema.json +13 -0
  237. package/schemas/requests/system/backup.schema.json +19 -0
  238. package/schemas/requests/system/cleanup.schema.json +20 -0
  239. package/schemas/requests/system/config.get.schema.json +14 -0
  240. package/schemas/requests/system/config.set.schema.json +24 -0
  241. package/schemas/requests/system/context.schema.json +7 -0
  242. package/schemas/requests/system/doctor.schema.json +7 -0
  243. package/schemas/requests/system/init.schema.json +18 -0
  244. package/schemas/requests/system/migrate.schema.json +19 -0
  245. package/schemas/requests/system/restore.schema.json +14 -0
  246. package/schemas/requests/system/stats.schema.json +7 -0
  247. package/schemas/requests/system/sync.schema.json +15 -0
  248. package/schemas/requests/system/version.schema.json +7 -0
  249. package/schemas/requests/tasks/analyze.schema.json +14 -0
  250. package/schemas/requests/tasks/archive.schema.json +19 -0
  251. package/schemas/requests/tasks/blockers.schema.json +15 -0
  252. package/schemas/requests/tasks/complete.schema.json +24 -0
  253. package/schemas/requests/tasks/create.schema.json +48 -0
  254. package/schemas/requests/tasks/delete.schema.json +20 -0
  255. package/schemas/requests/tasks/deps.schema.json +21 -0
  256. package/schemas/requests/tasks/exists.schema.json +15 -0
  257. package/schemas/requests/tasks/find.schema.json +22 -0
  258. package/schemas/requests/tasks/get.schema.json +15 -0
  259. package/schemas/requests/tasks/list.schema.json +26 -0
  260. package/schemas/requests/tasks/next.schema.json +21 -0
  261. package/schemas/requests/tasks/promote.schema.json +15 -0
  262. package/schemas/requests/tasks/reopen.schema.json +15 -0
  263. package/schemas/requests/tasks/reorder.schema.json +20 -0
  264. package/schemas/requests/tasks/reparent.schema.json +20 -0
  265. package/schemas/requests/tasks/tree.schema.json +21 -0
  266. package/schemas/requests/tasks/unarchive.schema.json +15 -0
  267. package/schemas/requests/tasks/update.schema.json +41 -0
  268. package/schemas/requests/validate/compliance.record.schema.json +20 -0
  269. package/schemas/requests/validate/compliance.summary.schema.json +18 -0
  270. package/schemas/requests/validate/compliance.violations.schema.json +19 -0
  271. package/schemas/requests/validate/manifest.schema.json +23 -0
  272. package/schemas/requests/validate/output.schema.json +19 -0
  273. package/schemas/requests/validate/protocol.schema.json +20 -0
  274. package/schemas/requests/validate/schema.schema.json +19 -0
  275. package/schemas/requests/validate/task.schema.json +21 -0
  276. package/schemas/requests/validate/test.coverage.schema.json +14 -0
  277. package/schemas/requests/validate/test.run.schema.json +22 -0
  278. package/schemas/requests/validate/test.status.schema.json +14 -0
  279. package/schemas/responses/common-error.schema.json +20 -0
  280. package/schemas/responses/common-success.schema.json +21 -0
  281. package/schemas/responses/lifecycle/check.schema.json +18 -0
  282. package/schemas/responses/lifecycle/gate.fail.schema.json +18 -0
  283. package/schemas/responses/lifecycle/gate.pass.schema.json +18 -0
  284. package/schemas/responses/lifecycle/gates.schema.json +18 -0
  285. package/schemas/responses/lifecycle/history.schema.json +18 -0
  286. package/schemas/responses/lifecycle/prerequisites.schema.json +18 -0
  287. package/schemas/responses/lifecycle/progress.schema.json +18 -0
  288. package/schemas/responses/lifecycle/reset.schema.json +18 -0
  289. package/schemas/responses/lifecycle/skip.schema.json +18 -0
  290. package/schemas/responses/lifecycle/status.schema.json +18 -0
  291. package/schemas/responses/orchestrate/analyze.schema.json +18 -0
  292. package/schemas/responses/orchestrate/context.schema.json +18 -0
  293. package/schemas/responses/orchestrate/next.schema.json +18 -0
  294. package/schemas/responses/orchestrate/parallel.end.schema.json +18 -0
  295. package/schemas/responses/orchestrate/parallel.start.schema.json +18 -0
  296. package/schemas/responses/orchestrate/ready.schema.json +18 -0
  297. package/schemas/responses/orchestrate/skill.list.schema.json +18 -0
  298. package/schemas/responses/orchestrate/spawn.schema.json +18 -0
  299. package/schemas/responses/orchestrate/startup.schema.json +18 -0
  300. package/schemas/responses/orchestrate/status.schema.json +18 -0
  301. package/schemas/responses/orchestrate/validate.schema.json +18 -0
  302. package/schemas/responses/orchestrate/waves.schema.json +18 -0
  303. package/schemas/responses/release/changelog.schema.json +18 -0
  304. package/schemas/responses/release/commit.schema.json +18 -0
  305. package/schemas/responses/release/gates.run.schema.json +18 -0
  306. package/schemas/responses/release/prepare.schema.json +18 -0
  307. package/schemas/responses/release/push.schema.json +18 -0
  308. package/schemas/responses/release/rollback.schema.json +18 -0
  309. package/schemas/responses/release/tag.schema.json +18 -0
  310. package/schemas/responses/research/inject.schema.json +18 -0
  311. package/schemas/responses/research/link.schema.json +18 -0
  312. package/schemas/responses/research/list.schema.json +18 -0
  313. package/schemas/responses/research/manifest.append.schema.json +18 -0
  314. package/schemas/responses/research/manifest.archive.schema.json +18 -0
  315. package/schemas/responses/research/manifest.read.schema.json +18 -0
  316. package/schemas/responses/research/pending.schema.json +18 -0
  317. package/schemas/responses/research/query.schema.json +18 -0
  318. package/schemas/responses/research/show.schema.json +18 -0
  319. package/schemas/responses/research/stats.schema.json +18 -0
  320. package/schemas/responses/session/end.schema.json +18 -0
  321. package/schemas/responses/session/focus.clear.schema.json +18 -0
  322. package/schemas/responses/session/focus.get.schema.json +18 -0
  323. package/schemas/responses/session/focus.set.schema.json +18 -0
  324. package/schemas/responses/session/gc.schema.json +18 -0
  325. package/schemas/responses/session/history.schema.json +18 -0
  326. package/schemas/responses/session/list.schema.json +18 -0
  327. package/schemas/responses/session/resume.schema.json +18 -0
  328. package/schemas/responses/session/show.schema.json +18 -0
  329. package/schemas/responses/session/start.schema.json +18 -0
  330. package/schemas/responses/session/status.schema.json +18 -0
  331. package/schemas/responses/session/suspend.schema.json +18 -0
  332. package/schemas/responses/system/backup.schema.json +18 -0
  333. package/schemas/responses/system/cleanup.schema.json +18 -0
  334. package/schemas/responses/system/config.get.schema.json +18 -0
  335. package/schemas/responses/system/config.set.schema.json +18 -0
  336. package/schemas/responses/system/context.schema.json +18 -0
  337. package/schemas/responses/system/doctor.schema.json +18 -0
  338. package/schemas/responses/system/init.schema.json +18 -0
  339. package/schemas/responses/system/migrate.schema.json +18 -0
  340. package/schemas/responses/system/restore.schema.json +18 -0
  341. package/schemas/responses/system/stats.schema.json +18 -0
  342. package/schemas/responses/system/sync.schema.json +18 -0
  343. package/schemas/responses/system/version.schema.json +18 -0
  344. package/schemas/responses/tasks/analyze.schema.json +18 -0
  345. package/schemas/responses/tasks/archive.schema.json +18 -0
  346. package/schemas/responses/tasks/blockers.schema.json +18 -0
  347. package/schemas/responses/tasks/complete.schema.json +18 -0
  348. package/schemas/responses/tasks/create.schema.json +18 -0
  349. package/schemas/responses/tasks/delete.schema.json +18 -0
  350. package/schemas/responses/tasks/deps.schema.json +18 -0
  351. package/schemas/responses/tasks/exists.schema.json +18 -0
  352. package/schemas/responses/tasks/find.schema.json +18 -0
  353. package/schemas/responses/tasks/get.schema.json +87 -0
  354. package/schemas/responses/tasks/list.schema.json +18 -0
  355. package/schemas/responses/tasks/next.schema.json +18 -0
  356. package/schemas/responses/tasks/promote.schema.json +18 -0
  357. package/schemas/responses/tasks/reopen.schema.json +18 -0
  358. package/schemas/responses/tasks/reorder.schema.json +18 -0
  359. package/schemas/responses/tasks/reparent.schema.json +18 -0
  360. package/schemas/responses/tasks/tree.schema.json +18 -0
  361. package/schemas/responses/tasks/unarchive.schema.json +18 -0
  362. package/schemas/responses/tasks/update.schema.json +18 -0
  363. package/schemas/responses/validate/compliance.record.schema.json +18 -0
  364. package/schemas/responses/validate/compliance.summary.schema.json +18 -0
  365. package/schemas/responses/validate/compliance.violations.schema.json +18 -0
  366. package/schemas/responses/validate/manifest.schema.json +18 -0
  367. package/schemas/responses/validate/output.schema.json +18 -0
  368. package/schemas/responses/validate/protocol.schema.json +18 -0
  369. package/schemas/responses/validate/schema.schema.json +18 -0
  370. package/schemas/responses/validate/task.schema.json +18 -0
  371. package/schemas/responses/validate/test.coverage.schema.json +18 -0
  372. package/schemas/responses/validate/test.run.schema.json +18 -0
  373. package/schemas/responses/validate/test.status.schema.json +18 -0
  374. package/server.json +53 -0
@@ -0,0 +1,937 @@
1
+ /**
2
+ * cleo_mutate Gateway - Write Operations
3
+ *
4
+ * Handles all state-modifying operations with strict validation,
5
+ * audit logging, and rollback support.
6
+ *
7
+ * Domains: tasks, session, orchestrate, research, lifecycle, validate, release, system
8
+ * Total operations: 53
9
+ *
10
+ * @task T2929
11
+ */
12
+ import { logMutation } from '../lib/audit.js';
13
+ /**
14
+ * Mutate operation matrix - all write operations by domain
15
+ * Reference: MCP-SERVER-SPECIFICATION.md Section 2.2.2
16
+ */
17
+ export const MUTATE_OPERATIONS = {
18
+ tasks: [
19
+ 'create', // Create new task
20
+ 'update', // Update task fields
21
+ 'complete', // Mark task done
22
+ 'delete', // Delete task
23
+ 'archive', // Archive done tasks
24
+ 'unarchive', // Restore from archive
25
+ 'reparent', // Change task parent
26
+ 'promote', // Promote subtask to task
27
+ 'reorder', // Reorder siblings
28
+ 'reopen', // Reopen completed task
29
+ ],
30
+ session: [
31
+ 'start', // Start new session
32
+ 'end', // End current session
33
+ 'resume', // Resume existing session
34
+ 'suspend', // Suspend session
35
+ 'focus.set', // Set focused task
36
+ 'focus.clear', // Clear focus
37
+ 'gc', // Garbage collect sessions
38
+ ],
39
+ orchestrate: [
40
+ 'startup', // Initialize orchestration
41
+ 'spawn', // Generate spawn prompt
42
+ 'validate', // Validate spawn readiness
43
+ 'parallel.start', // Start parallel wave
44
+ 'parallel.end', // End parallel wave
45
+ ],
46
+ research: [
47
+ 'inject', // Get protocol injection
48
+ 'link', // Link research to task
49
+ 'manifest.append', // Append manifest entry
50
+ 'manifest.archive', // Archive old entries
51
+ ],
52
+ lifecycle: [
53
+ 'progress', // Record stage completion
54
+ 'skip', // Skip optional stage
55
+ 'reset', // Reset stage (emergency)
56
+ 'gate.pass', // Mark gate as passed
57
+ 'gate.fail', // Mark gate as failed
58
+ ],
59
+ validate: [
60
+ 'compliance.record', // Record compliance check
61
+ 'test.run', // Execute test suite
62
+ ],
63
+ release: [
64
+ 'prepare', // Prepare release
65
+ 'changelog', // Generate changelog
66
+ 'commit', // Create release commit
67
+ 'tag', // Create git tag
68
+ 'push', // Push to remote
69
+ 'gates.run', // Run release gates
70
+ 'rollback', // Rollback release
71
+ ],
72
+ system: [
73
+ 'init', // Initialize CLEO
74
+ 'config.set', // Set config value
75
+ 'backup', // Create backup
76
+ 'restore', // Restore from backup
77
+ 'migrate', // Run migrations
78
+ 'sync', // Sync with TodoWrite
79
+ 'cleanup', // Cleanup stale data
80
+ 'job.cancel', // Cancel background job
81
+ ],
82
+ };
83
+ /**
84
+ * Total operation count check
85
+ */
86
+ const EXPECTED_MUTATE_COUNT = 48;
87
+ const actualMutateCount = Object.values(MUTATE_OPERATIONS).flat().length;
88
+ if (actualMutateCount !== EXPECTED_MUTATE_COUNT) {
89
+ console.error(`Warning: Mutate operation count mismatch. Expected ${EXPECTED_MUTATE_COUNT}, got ${actualMutateCount}`);
90
+ }
91
+ /**
92
+ * Idempotent operations that may return success for already-completed actions
93
+ * These operations use exit codes 100+ to signal "already done" vs "just completed"
94
+ */
95
+ const IDEMPOTENT_OPERATIONS = {
96
+ tasks: ['complete', 'archive'],
97
+ session: ['end', 'focus.clear', 'gc'],
98
+ lifecycle: ['progress', 'skip', 'gate.pass'],
99
+ validate: ['compliance.record'],
100
+ release: ['tag', 'push'],
101
+ system: ['init', 'migrate', 'cleanup'],
102
+ };
103
+ /**
104
+ * Operations that require session binding
105
+ */
106
+ const SESSION_REQUIRED_OPERATIONS = {
107
+ tasks: ['create', 'update', 'complete'],
108
+ session: ['start', 'focus.set'],
109
+ orchestrate: ['startup', 'spawn'],
110
+ };
111
+ /**
112
+ * Validate mutate request parameters
113
+ */
114
+ export function validateMutateParams(request) {
115
+ const { domain, operation, params } = request;
116
+ // Check if domain is valid
117
+ if (!MUTATE_OPERATIONS[domain]) {
118
+ return {
119
+ valid: false,
120
+ error: {
121
+ _meta: {
122
+ gateway: 'cleo_mutate',
123
+ domain,
124
+ operation,
125
+ version: '1.0.0',
126
+ timestamp: new Date().toISOString(),
127
+ duration_ms: 0,
128
+ },
129
+ success: false,
130
+ error: {
131
+ code: 'E_INVALID_DOMAIN',
132
+ exitCode: 2,
133
+ message: `Unknown mutate domain: ${domain}`,
134
+ fix: `Use one of: ${Object.keys(MUTATE_OPERATIONS).join(', ')}`,
135
+ alternatives: Object.keys(MUTATE_OPERATIONS).map((d) => ({
136
+ action: `List ${d} operations`,
137
+ command: `Available: ${MUTATE_OPERATIONS[d].join(', ')}`,
138
+ })),
139
+ },
140
+ },
141
+ };
142
+ }
143
+ // Check if operation is valid for this domain
144
+ const validOps = MUTATE_OPERATIONS[domain];
145
+ if (!validOps.includes(operation)) {
146
+ return {
147
+ valid: false,
148
+ error: {
149
+ _meta: {
150
+ gateway: 'cleo_mutate',
151
+ domain,
152
+ operation,
153
+ version: '1.0.0',
154
+ timestamp: new Date().toISOString(),
155
+ duration_ms: 0,
156
+ },
157
+ success: false,
158
+ error: {
159
+ code: 'E_INVALID_OPERATION',
160
+ exitCode: 2,
161
+ message: `Operation '${operation}' not supported for cleo_mutate in domain '${domain}'`,
162
+ fix: `Use one of: ${validOps.join(', ')}`,
163
+ alternatives: validOps.map((op) => ({
164
+ action: `Use ${op}`,
165
+ command: `cleo_mutate ${domain} ${op}`,
166
+ })),
167
+ },
168
+ },
169
+ };
170
+ }
171
+ // Perform operation-specific parameter validation
172
+ const paramValidation = validateOperationParams(domain, operation, params);
173
+ if (!paramValidation.valid) {
174
+ return paramValidation;
175
+ }
176
+ return { valid: true };
177
+ }
178
+ /**
179
+ * Validate operation-specific parameters
180
+ */
181
+ function validateOperationParams(domain, operation, params) {
182
+ // Domain-specific parameter validation
183
+ switch (domain) {
184
+ case 'tasks':
185
+ return validateTasksParams(operation, params);
186
+ case 'session':
187
+ return validateSessionParams(operation, params);
188
+ case 'orchestrate':
189
+ return validateOrchestrateParams(operation, params);
190
+ case 'research':
191
+ return validateResearchParams(operation, params);
192
+ case 'lifecycle':
193
+ return validateLifecycleParams(operation, params);
194
+ case 'validate':
195
+ return validateValidateParams(operation, params);
196
+ case 'release':
197
+ return validateReleaseParams(operation, params);
198
+ case 'system':
199
+ return validateSystemParams(operation, params);
200
+ default:
201
+ return { valid: true };
202
+ }
203
+ }
204
+ /**
205
+ * Validate tasks domain parameters
206
+ */
207
+ function validateTasksParams(operation, params) {
208
+ switch (operation) {
209
+ case 'create':
210
+ if (!params?.title || !params?.description) {
211
+ return {
212
+ valid: false,
213
+ error: {
214
+ _meta: {
215
+ gateway: 'cleo_mutate',
216
+ domain: 'tasks',
217
+ operation,
218
+ version: '1.0.0',
219
+ timestamp: new Date().toISOString(),
220
+ duration_ms: 0,
221
+ },
222
+ success: false,
223
+ error: {
224
+ code: 'E_VALIDATION_FAILED',
225
+ exitCode: 6,
226
+ message: 'Missing required parameters: title and description',
227
+ fix: 'Provide both title and description fields',
228
+ },
229
+ },
230
+ };
231
+ }
232
+ if (params.title === params.description) {
233
+ return {
234
+ valid: false,
235
+ error: {
236
+ _meta: {
237
+ gateway: 'cleo_mutate',
238
+ domain: 'tasks',
239
+ operation,
240
+ version: '1.0.0',
241
+ timestamp: new Date().toISOString(),
242
+ duration_ms: 0,
243
+ },
244
+ success: false,
245
+ error: {
246
+ code: 'E_VALIDATION_FAILED',
247
+ exitCode: 6,
248
+ message: 'Title and description must be different (anti-hallucination requirement)',
249
+ fix: 'Provide a unique description that differs from the title',
250
+ },
251
+ },
252
+ };
253
+ }
254
+ break;
255
+ case 'update':
256
+ case 'complete':
257
+ case 'delete':
258
+ case 'unarchive':
259
+ case 'reparent':
260
+ case 'promote':
261
+ case 'reorder':
262
+ case 'reopen':
263
+ if (!params?.taskId) {
264
+ return {
265
+ valid: false,
266
+ error: {
267
+ _meta: {
268
+ gateway: 'cleo_mutate',
269
+ domain: 'tasks',
270
+ operation,
271
+ version: '1.0.0',
272
+ timestamp: new Date().toISOString(),
273
+ duration_ms: 0,
274
+ },
275
+ success: false,
276
+ error: {
277
+ code: 'E_VALIDATION_FAILED',
278
+ exitCode: 6,
279
+ message: 'Missing required parameter: taskId',
280
+ fix: 'Provide taskId parameter',
281
+ },
282
+ },
283
+ };
284
+ }
285
+ break;
286
+ }
287
+ return { valid: true };
288
+ }
289
+ /**
290
+ * Validate session domain parameters
291
+ */
292
+ function validateSessionParams(operation, params) {
293
+ switch (operation) {
294
+ case 'start':
295
+ if (!params?.scope) {
296
+ return {
297
+ valid: false,
298
+ error: {
299
+ _meta: {
300
+ gateway: 'cleo_mutate',
301
+ domain: 'session',
302
+ operation,
303
+ version: '1.0.0',
304
+ timestamp: new Date().toISOString(),
305
+ duration_ms: 0,
306
+ },
307
+ success: false,
308
+ error: {
309
+ code: 'E_VALIDATION_FAILED',
310
+ exitCode: 6,
311
+ message: 'Missing required parameter: scope',
312
+ fix: 'Provide scope parameter (e.g., "epic:T1234")',
313
+ },
314
+ },
315
+ };
316
+ }
317
+ break;
318
+ case 'resume':
319
+ if (!params?.sessionId) {
320
+ return {
321
+ valid: false,
322
+ error: {
323
+ _meta: {
324
+ gateway: 'cleo_mutate',
325
+ domain: 'session',
326
+ operation,
327
+ version: '1.0.0',
328
+ timestamp: new Date().toISOString(),
329
+ duration_ms: 0,
330
+ },
331
+ success: false,
332
+ error: {
333
+ code: 'E_VALIDATION_FAILED',
334
+ exitCode: 6,
335
+ message: 'Missing required parameter: sessionId',
336
+ fix: 'Provide sessionId parameter',
337
+ },
338
+ },
339
+ };
340
+ }
341
+ break;
342
+ case 'focus.set':
343
+ if (!params?.taskId) {
344
+ return {
345
+ valid: false,
346
+ error: {
347
+ _meta: {
348
+ gateway: 'cleo_mutate',
349
+ domain: 'session',
350
+ operation,
351
+ version: '1.0.0',
352
+ timestamp: new Date().toISOString(),
353
+ duration_ms: 0,
354
+ },
355
+ success: false,
356
+ error: {
357
+ code: 'E_VALIDATION_FAILED',
358
+ exitCode: 6,
359
+ message: 'Missing required parameter: taskId',
360
+ fix: 'Provide taskId parameter',
361
+ },
362
+ },
363
+ };
364
+ }
365
+ break;
366
+ }
367
+ return { valid: true };
368
+ }
369
+ /**
370
+ * Validate orchestrate domain parameters
371
+ */
372
+ function validateOrchestrateParams(operation, params) {
373
+ switch (operation) {
374
+ case 'startup':
375
+ if (!params?.epicId) {
376
+ return {
377
+ valid: false,
378
+ error: {
379
+ _meta: {
380
+ gateway: 'cleo_mutate',
381
+ domain: 'orchestrate',
382
+ operation,
383
+ version: '1.0.0',
384
+ timestamp: new Date().toISOString(),
385
+ duration_ms: 0,
386
+ },
387
+ success: false,
388
+ error: {
389
+ code: 'E_VALIDATION_FAILED',
390
+ exitCode: 6,
391
+ message: 'Missing required parameter: epicId',
392
+ fix: 'Provide epicId parameter',
393
+ },
394
+ },
395
+ };
396
+ }
397
+ break;
398
+ case 'spawn':
399
+ case 'validate':
400
+ if (!params?.taskId) {
401
+ return {
402
+ valid: false,
403
+ error: {
404
+ _meta: {
405
+ gateway: 'cleo_mutate',
406
+ domain: 'orchestrate',
407
+ operation,
408
+ version: '1.0.0',
409
+ timestamp: new Date().toISOString(),
410
+ duration_ms: 0,
411
+ },
412
+ success: false,
413
+ error: {
414
+ code: 'E_VALIDATION_FAILED',
415
+ exitCode: 6,
416
+ message: 'Missing required parameter: taskId',
417
+ fix: 'Provide taskId parameter',
418
+ },
419
+ },
420
+ };
421
+ }
422
+ break;
423
+ case 'parallel.start':
424
+ case 'parallel.end':
425
+ if (!params?.epicId || params?.wave === undefined) {
426
+ return {
427
+ valid: false,
428
+ error: {
429
+ _meta: {
430
+ gateway: 'cleo_mutate',
431
+ domain: 'orchestrate',
432
+ operation,
433
+ version: '1.0.0',
434
+ timestamp: new Date().toISOString(),
435
+ duration_ms: 0,
436
+ },
437
+ success: false,
438
+ error: {
439
+ code: 'E_VALIDATION_FAILED',
440
+ exitCode: 6,
441
+ message: 'Missing required parameters: epicId and wave',
442
+ fix: 'Provide both epicId and wave parameters',
443
+ },
444
+ },
445
+ };
446
+ }
447
+ break;
448
+ }
449
+ return { valid: true };
450
+ }
451
+ /**
452
+ * Validate research domain parameters
453
+ */
454
+ function validateResearchParams(operation, params) {
455
+ switch (operation) {
456
+ case 'inject':
457
+ if (!params?.protocolType) {
458
+ return {
459
+ valid: false,
460
+ error: {
461
+ _meta: {
462
+ gateway: 'cleo_mutate',
463
+ domain: 'research',
464
+ operation,
465
+ version: '1.0.0',
466
+ timestamp: new Date().toISOString(),
467
+ duration_ms: 0,
468
+ },
469
+ success: false,
470
+ error: {
471
+ code: 'E_VALIDATION_FAILED',
472
+ exitCode: 6,
473
+ message: 'Missing required parameter: protocolType',
474
+ fix: 'Provide protocolType parameter (e.g., "research", "implementation")',
475
+ },
476
+ },
477
+ };
478
+ }
479
+ break;
480
+ case 'link':
481
+ if (!params?.researchId || !params?.taskId) {
482
+ return {
483
+ valid: false,
484
+ error: {
485
+ _meta: {
486
+ gateway: 'cleo_mutate',
487
+ domain: 'research',
488
+ operation,
489
+ version: '1.0.0',
490
+ timestamp: new Date().toISOString(),
491
+ duration_ms: 0,
492
+ },
493
+ success: false,
494
+ error: {
495
+ code: 'E_VALIDATION_FAILED',
496
+ exitCode: 6,
497
+ message: 'Missing required parameters: researchId and taskId',
498
+ fix: 'Provide both researchId and taskId parameters',
499
+ },
500
+ },
501
+ };
502
+ }
503
+ break;
504
+ case 'manifest.append':
505
+ if (!params?.entry) {
506
+ return {
507
+ valid: false,
508
+ error: {
509
+ _meta: {
510
+ gateway: 'cleo_mutate',
511
+ domain: 'research',
512
+ operation,
513
+ version: '1.0.0',
514
+ timestamp: new Date().toISOString(),
515
+ duration_ms: 0,
516
+ },
517
+ success: false,
518
+ error: {
519
+ code: 'E_VALIDATION_FAILED',
520
+ exitCode: 6,
521
+ message: 'Missing required parameter: entry',
522
+ fix: 'Provide entry parameter with manifest entry object',
523
+ },
524
+ },
525
+ };
526
+ }
527
+ break;
528
+ }
529
+ return { valid: true };
530
+ }
531
+ /**
532
+ * Validate lifecycle domain parameters
533
+ */
534
+ function validateLifecycleParams(operation, params) {
535
+ switch (operation) {
536
+ case 'progress':
537
+ if (!params?.taskId || !params?.stage || !params?.status) {
538
+ return {
539
+ valid: false,
540
+ error: {
541
+ _meta: {
542
+ gateway: 'cleo_mutate',
543
+ domain: 'lifecycle',
544
+ operation,
545
+ version: '1.0.0',
546
+ timestamp: new Date().toISOString(),
547
+ duration_ms: 0,
548
+ },
549
+ success: false,
550
+ error: {
551
+ code: 'E_VALIDATION_FAILED',
552
+ exitCode: 6,
553
+ message: 'Missing required parameters: taskId, stage, and status',
554
+ fix: 'Provide taskId, stage, and status parameters',
555
+ },
556
+ },
557
+ };
558
+ }
559
+ break;
560
+ case 'skip':
561
+ case 'reset':
562
+ if (!params?.taskId || !params?.stage || !params?.reason) {
563
+ return {
564
+ valid: false,
565
+ error: {
566
+ _meta: {
567
+ gateway: 'cleo_mutate',
568
+ domain: 'lifecycle',
569
+ operation,
570
+ version: '1.0.0',
571
+ timestamp: new Date().toISOString(),
572
+ duration_ms: 0,
573
+ },
574
+ success: false,
575
+ error: {
576
+ code: 'E_VALIDATION_FAILED',
577
+ exitCode: 6,
578
+ message: 'Missing required parameters: taskId, stage, and reason',
579
+ fix: 'Provide taskId, stage, and reason parameters',
580
+ },
581
+ },
582
+ };
583
+ }
584
+ break;
585
+ case 'gate.pass':
586
+ case 'gate.fail':
587
+ if (!params?.taskId || !params?.gateName) {
588
+ return {
589
+ valid: false,
590
+ error: {
591
+ _meta: {
592
+ gateway: 'cleo_mutate',
593
+ domain: 'lifecycle',
594
+ operation,
595
+ version: '1.0.0',
596
+ timestamp: new Date().toISOString(),
597
+ duration_ms: 0,
598
+ },
599
+ success: false,
600
+ error: {
601
+ code: 'E_VALIDATION_FAILED',
602
+ exitCode: 6,
603
+ message: 'Missing required parameters: taskId and gateName',
604
+ fix: 'Provide taskId and gateName parameters',
605
+ },
606
+ },
607
+ };
608
+ }
609
+ break;
610
+ }
611
+ return { valid: true };
612
+ }
613
+ /**
614
+ * Validate validate domain parameters
615
+ */
616
+ function validateValidateParams(operation, params) {
617
+ switch (operation) {
618
+ case 'compliance.record':
619
+ if (!params?.taskId || !params?.result) {
620
+ return {
621
+ valid: false,
622
+ error: {
623
+ _meta: {
624
+ gateway: 'cleo_mutate',
625
+ domain: 'validate',
626
+ operation,
627
+ version: '1.0.0',
628
+ timestamp: new Date().toISOString(),
629
+ duration_ms: 0,
630
+ },
631
+ success: false,
632
+ error: {
633
+ code: 'E_VALIDATION_FAILED',
634
+ exitCode: 6,
635
+ message: 'Missing required parameters: taskId and result',
636
+ fix: 'Provide taskId and result parameters',
637
+ },
638
+ },
639
+ };
640
+ }
641
+ break;
642
+ }
643
+ return { valid: true };
644
+ }
645
+ /**
646
+ * Validate release domain parameters
647
+ */
648
+ function validateReleaseParams(operation, params) {
649
+ switch (operation) {
650
+ case 'prepare':
651
+ case 'changelog':
652
+ case 'commit':
653
+ case 'tag':
654
+ case 'push':
655
+ case 'rollback':
656
+ if (!params?.version) {
657
+ return {
658
+ valid: false,
659
+ error: {
660
+ _meta: {
661
+ gateway: 'cleo_mutate',
662
+ domain: 'release',
663
+ operation,
664
+ version: '1.0.0',
665
+ timestamp: new Date().toISOString(),
666
+ duration_ms: 0,
667
+ },
668
+ success: false,
669
+ error: {
670
+ code: 'E_VALIDATION_FAILED',
671
+ exitCode: 6,
672
+ message: 'Missing required parameter: version',
673
+ fix: 'Provide version parameter (semver format)',
674
+ },
675
+ },
676
+ };
677
+ }
678
+ break;
679
+ }
680
+ return { valid: true };
681
+ }
682
+ /**
683
+ * Validate system domain parameters
684
+ */
685
+ function validateSystemParams(operation, params) {
686
+ switch (operation) {
687
+ case 'config.set':
688
+ if (!params?.key || params?.value === undefined) {
689
+ return {
690
+ valid: false,
691
+ error: {
692
+ _meta: {
693
+ gateway: 'cleo_mutate',
694
+ domain: 'system',
695
+ operation,
696
+ version: '1.0.0',
697
+ timestamp: new Date().toISOString(),
698
+ duration_ms: 0,
699
+ },
700
+ success: false,
701
+ error: {
702
+ code: 'E_VALIDATION_FAILED',
703
+ exitCode: 6,
704
+ message: 'Missing required parameters: key and value',
705
+ fix: 'Provide key and value parameters',
706
+ },
707
+ },
708
+ };
709
+ }
710
+ break;
711
+ case 'restore':
712
+ if (!params?.backupId) {
713
+ return {
714
+ valid: false,
715
+ error: {
716
+ _meta: {
717
+ gateway: 'cleo_mutate',
718
+ domain: 'system',
719
+ operation,
720
+ version: '1.0.0',
721
+ timestamp: new Date().toISOString(),
722
+ duration_ms: 0,
723
+ },
724
+ success: false,
725
+ error: {
726
+ code: 'E_VALIDATION_FAILED',
727
+ exitCode: 6,
728
+ message: 'Missing required parameter: backupId',
729
+ fix: 'Provide backupId parameter',
730
+ },
731
+ },
732
+ };
733
+ }
734
+ break;
735
+ case 'job.cancel':
736
+ if (!params?.jobId) {
737
+ return {
738
+ valid: false,
739
+ error: {
740
+ _meta: {
741
+ gateway: 'cleo_mutate',
742
+ domain: 'system',
743
+ operation,
744
+ version: '1.0.0',
745
+ timestamp: new Date().toISOString(),
746
+ duration_ms: 0,
747
+ },
748
+ success: false,
749
+ error: {
750
+ code: 'E_VALIDATION_FAILED',
751
+ exitCode: 6,
752
+ message: 'Missing required parameter: jobId',
753
+ fix: 'Provide jobId parameter',
754
+ },
755
+ },
756
+ };
757
+ }
758
+ break;
759
+ case 'cleanup':
760
+ if (!params?.type) {
761
+ return {
762
+ valid: false,
763
+ error: {
764
+ _meta: {
765
+ gateway: 'cleo_mutate',
766
+ domain: 'system',
767
+ operation,
768
+ version: '1.0.0',
769
+ timestamp: new Date().toISOString(),
770
+ duration_ms: 0,
771
+ },
772
+ success: false,
773
+ error: {
774
+ code: 'E_VALIDATION_FAILED',
775
+ exitCode: 6,
776
+ message: 'Missing required parameter: type',
777
+ fix: 'Provide type parameter (e.g., "sessions", "backups")',
778
+ },
779
+ },
780
+ };
781
+ }
782
+ break;
783
+ }
784
+ return { valid: true };
785
+ }
786
+ /**
787
+ * Register cleo_mutate tool with MCP server
788
+ *
789
+ * Returns tool definition for ListToolsRequestSchema handler
790
+ */
791
+ export function registerMutateTool() {
792
+ return {
793
+ name: 'cleo_mutate',
794
+ description: 'CLEO write operations: create, update, complete tasks; manage sessions; spawn agents; progress lifecycle; execute releases. Modifies state with validation.',
795
+ inputSchema: {
796
+ type: 'object',
797
+ required: ['domain', 'operation'],
798
+ properties: {
799
+ domain: {
800
+ type: 'string',
801
+ enum: Object.keys(MUTATE_OPERATIONS),
802
+ description: 'Functional domain to mutate',
803
+ },
804
+ operation: {
805
+ type: 'string',
806
+ description: 'Domain-specific write operation (see operation matrix)',
807
+ },
808
+ params: {
809
+ type: 'object',
810
+ description: 'Operation-specific parameters',
811
+ additionalProperties: true,
812
+ },
813
+ },
814
+ },
815
+ };
816
+ }
817
+ /**
818
+ * Handle cleo_mutate request
819
+ *
820
+ * Validates parameters, logs to audit trail, routes to domain handler,
821
+ * and handles idempotency
822
+ *
823
+ * @param request Mutate request with domain, operation, and params
824
+ * @returns Promise resolving to mutate response
825
+ */
826
+ export async function handleMutateRequest(request) {
827
+ const startTime = Date.now();
828
+ // Validate request parameters
829
+ const validation = validateMutateParams(request);
830
+ if (!validation.valid) {
831
+ return validation.error;
832
+ }
833
+ // Extract task ID from params if present
834
+ const taskId = typeof request.params?.taskId === 'string' ? request.params.taskId : undefined;
835
+ const sessionId = process.env.CLEO_SESSION_ID || null;
836
+ // Log mutation attempt to audit trail
837
+ const auditEntry = {
838
+ timestamp: new Date().toISOString(),
839
+ sessionId,
840
+ domain: request.domain,
841
+ operation: request.operation,
842
+ params: request.params || {},
843
+ result: {
844
+ success: false,
845
+ exitCode: 0,
846
+ duration: 0,
847
+ },
848
+ metadata: {
849
+ taskId,
850
+ source: 'mcp',
851
+ gateway: 'cleo_mutate',
852
+ },
853
+ };
854
+ try {
855
+ // Build domain request (will be routed by DomainRouter)
856
+ const domainRequest = {
857
+ gateway: 'cleo_mutate',
858
+ domain: request.domain,
859
+ operation: request.operation,
860
+ params: request.params,
861
+ };
862
+ // Create response (this function is called by the router)
863
+ const response = {
864
+ _meta: {
865
+ gateway: 'cleo_mutate',
866
+ domain: request.domain,
867
+ operation: request.operation,
868
+ version: '1.0.0',
869
+ timestamp: new Date().toISOString(),
870
+ duration_ms: Date.now() - startTime,
871
+ },
872
+ success: true,
873
+ data: domainRequest,
874
+ };
875
+ // Update audit entry with success
876
+ auditEntry.result.success = true;
877
+ auditEntry.result.exitCode = 0;
878
+ auditEntry.result.duration = Date.now() - startTime;
879
+ // Log to audit trail (async, non-blocking)
880
+ logMutation(auditEntry).catch((err) => {
881
+ console.error('Failed to log mutation to audit trail:', err);
882
+ });
883
+ return response;
884
+ }
885
+ catch (error) {
886
+ // Update audit entry with failure
887
+ auditEntry.result.success = false;
888
+ auditEntry.result.exitCode = 1; // TODO: Extract actual exit code from CLI response
889
+ auditEntry.result.duration = Date.now() - startTime;
890
+ auditEntry.error = error instanceof Error ? error.message : String(error);
891
+ // Log to audit trail (async, non-blocking)
892
+ logMutation(auditEntry).catch((err) => {
893
+ console.error('Failed to log mutation error to audit trail:', err);
894
+ });
895
+ throw error;
896
+ }
897
+ }
898
+ /**
899
+ * Check if operation is idempotent
900
+ */
901
+ export function isIdempotentOperation(domain, operation) {
902
+ return IDEMPOTENT_OPERATIONS[domain]?.includes(operation) || false;
903
+ }
904
+ /**
905
+ * Check if operation requires session binding
906
+ */
907
+ export function requiresSession(domain, operation) {
908
+ return SESSION_REQUIRED_OPERATIONS[domain]?.includes(operation) || false;
909
+ }
910
+ /**
911
+ * Get mutate operation count for specific domain or all domains
912
+ */
913
+ export function getMutateOperationCount(domain) {
914
+ if (domain) {
915
+ return MUTATE_OPERATIONS[domain]?.length || 0;
916
+ }
917
+ return actualMutateCount;
918
+ }
919
+ /**
920
+ * Check if operation is write (mutate)
921
+ */
922
+ export function isMutateOperation(domain, operation) {
923
+ return MUTATE_OPERATIONS[domain]?.includes(operation) || false;
924
+ }
925
+ /**
926
+ * Get all mutate domains
927
+ */
928
+ export function getMutateDomains() {
929
+ return Object.keys(MUTATE_OPERATIONS);
930
+ }
931
+ /**
932
+ * Get operations for specific mutate domain
933
+ */
934
+ export function getMutateOperations(domain) {
935
+ return MUTATE_OPERATIONS[domain] || [];
936
+ }
937
+ //# sourceMappingURL=mutate.js.map