atabey 0.0.12 → 0.0.14

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 (432) hide show
  1. package/ATABEY.md +45 -499
  2. package/PRIVACY.md +161 -0
  3. package/README.md +553 -88
  4. package/bin/validate-al-registry.js +4 -4
  5. package/dist/framework-mcp/src/index.js +914 -62
  6. package/dist/framework-mcp/src/index.js.map +1 -1
  7. package/dist/framework-mcp/src/tools/compliance/mask_pii.d.ts +17 -0
  8. package/dist/framework-mcp/src/tools/compliance/mask_pii.js +56 -0
  9. package/dist/framework-mcp/src/tools/compliance/mask_pii.js.map +1 -0
  10. package/dist/framework-mcp/src/tools/definitions.js +24 -1
  11. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  12. package/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  13. package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
  14. package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.d.ts +19 -0
  15. package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +138 -0
  16. package/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js.map +1 -0
  17. package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.d.ts +8 -0
  18. package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +91 -0
  19. package/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js.map +1 -0
  20. package/dist/framework-mcp/src/tools/index.d.ts +1 -1
  21. package/dist/framework-mcp/src/tools/index.js +34 -20
  22. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  23. package/dist/framework-mcp/src/tools/messaging/approve_operation.d.ts +22 -0
  24. package/dist/framework-mcp/src/tools/messaging/approve_operation.js +81 -0
  25. package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -0
  26. package/dist/framework-mcp/src/tools/messaging/ask_human.d.ts +15 -0
  27. package/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  28. package/dist/framework-mcp/src/tools/messaging/ask_human.js.map +1 -1
  29. package/dist/framework-mcp/src/tools/observability/check_ports.js +3 -1
  30. package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
  31. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.d.ts +11 -0
  32. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +115 -0
  33. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -0
  34. package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.d.ts +11 -0
  35. package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +135 -0
  36. package/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js.map +1 -0
  37. package/dist/framework-mcp/src/tools/schemas.d.ts +90 -15
  38. package/dist/framework-mcp/src/tools/schemas.js +32 -7
  39. package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
  40. package/dist/framework-mcp/src/tools/shell/run_command.js +12 -2
  41. package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
  42. package/dist/framework-mcp/src/tools/types.d.ts +11 -105
  43. package/dist/framework-mcp/src/tools/types.js +1 -0
  44. package/dist/framework-mcp/src/tools/types.js.map +1 -1
  45. package/dist/framework-mcp/src/utils/auth.d.ts +36 -0
  46. package/dist/framework-mcp/src/utils/auth.js +79 -0
  47. package/dist/framework-mcp/src/utils/auth.js.map +1 -0
  48. package/dist/framework-mcp/src/utils/auto-rollback.d.ts +71 -0
  49. package/dist/framework-mcp/src/utils/auto-rollback.js +266 -0
  50. package/dist/framework-mcp/src/utils/auto-rollback.js.map +1 -0
  51. package/dist/framework-mcp/src/utils/compliance.js +12 -4
  52. package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
  53. package/dist/framework-mcp/src/utils/context-optimizer.d.ts +69 -0
  54. package/dist/framework-mcp/src/utils/context-optimizer.js +157 -0
  55. package/dist/framework-mcp/src/utils/context-optimizer.js.map +1 -0
  56. package/dist/framework-mcp/src/utils/discipline.d.ts +68 -0
  57. package/dist/framework-mcp/src/utils/discipline.js +218 -0
  58. package/dist/framework-mcp/src/utils/discipline.js.map +1 -0
  59. package/dist/framework-mcp/src/utils/finops.d.ts +143 -0
  60. package/dist/framework-mcp/src/utils/finops.js +326 -0
  61. package/dist/framework-mcp/src/utils/finops.js.map +1 -0
  62. package/dist/framework-mcp/src/utils/human-in-loop.d.ts +95 -0
  63. package/dist/framework-mcp/src/utils/human-in-loop.js +216 -0
  64. package/dist/framework-mcp/src/utils/human-in-loop.js.map +1 -0
  65. package/dist/framework-mcp/src/utils/license-scanner.d.ts +71 -0
  66. package/dist/framework-mcp/src/utils/license-scanner.js +284 -0
  67. package/dist/framework-mcp/src/utils/license-scanner.js.map +1 -0
  68. package/dist/framework-mcp/src/utils/loop-detector.d.ts +105 -0
  69. package/dist/framework-mcp/src/utils/loop-detector.js +362 -0
  70. package/dist/framework-mcp/src/utils/loop-detector.js.map +1 -0
  71. package/dist/framework-mcp/src/utils/quality.d.ts +19 -0
  72. package/dist/framework-mcp/src/utils/quality.js +124 -0
  73. package/dist/framework-mcp/src/utils/quality.js.map +1 -0
  74. package/dist/framework-mcp/src/utils/rules-engine.d.ts +78 -0
  75. package/dist/framework-mcp/src/utils/rules-engine.js +232 -0
  76. package/dist/framework-mcp/src/utils/rules-engine.js.map +1 -0
  77. package/dist/framework-mcp/src/utils/silent-router.d.ts +47 -0
  78. package/dist/framework-mcp/src/utils/silent-router.js +129 -0
  79. package/dist/framework-mcp/src/utils/silent-router.js.map +1 -0
  80. package/dist/framework-mcp/src/utils/storage.d.ts +1 -0
  81. package/dist/framework-mcp/src/utils/storage.js +2 -2
  82. package/dist/framework-mcp/src/utils/storage.js.map +1 -1
  83. package/dist/framework-mcp/src/utils/telemetry-streamer.d.ts +133 -0
  84. package/dist/framework-mcp/src/utils/telemetry-streamer.js +397 -0
  85. package/dist/framework-mcp/src/utils/telemetry-streamer.js.map +1 -0
  86. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +2 -2
  87. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
  88. package/dist/framework-mcp/tests/tools/framework/run_tests.test.d.ts +1 -0
  89. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js +49 -0
  90. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js.map +1 -0
  91. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +14 -5
  92. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
  93. package/dist/framework-mcp/tests/tools/observability/check_ports.test.d.ts +1 -0
  94. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js +30 -0
  95. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js.map +1 -0
  96. package/dist/framework-mcp/tests/tools/shell/run_command.test.js +7 -0
  97. package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -1
  98. package/dist/framework-mcp/tests/utils/auto-rollback.test.d.ts +7 -0
  99. package/dist/framework-mcp/tests/utils/auto-rollback.test.js +178 -0
  100. package/dist/framework-mcp/tests/utils/auto-rollback.test.js.map +1 -0
  101. package/dist/framework-mcp/tests/utils/context-optimizer.test.d.ts +1 -0
  102. package/dist/framework-mcp/tests/utils/context-optimizer.test.js +62 -0
  103. package/dist/framework-mcp/tests/utils/context-optimizer.test.js.map +1 -0
  104. package/dist/framework-mcp/tests/utils/finops.test.d.ts +7 -0
  105. package/dist/framework-mcp/tests/utils/finops.test.js +157 -0
  106. package/dist/framework-mcp/tests/utils/finops.test.js.map +1 -0
  107. package/dist/framework-mcp/tests/utils/human-in-loop.test.d.ts +1 -0
  108. package/dist/framework-mcp/tests/utils/human-in-loop.test.js +59 -0
  109. package/dist/framework-mcp/tests/utils/human-in-loop.test.js.map +1 -0
  110. package/dist/framework-mcp/tests/utils/license-scanner.test.d.ts +7 -0
  111. package/dist/framework-mcp/tests/utils/license-scanner.test.js +131 -0
  112. package/dist/framework-mcp/tests/utils/license-scanner.test.js.map +1 -0
  113. package/dist/framework-mcp/tests/utils/loop-detector.test.d.ts +7 -0
  114. package/dist/framework-mcp/tests/utils/loop-detector.test.js +204 -0
  115. package/dist/framework-mcp/tests/utils/loop-detector.test.js.map +1 -0
  116. package/dist/framework-mcp/tests/utils/rules-engine.test.d.ts +1 -0
  117. package/dist/framework-mcp/tests/utils/rules-engine.test.js +106 -0
  118. package/dist/framework-mcp/tests/utils/rules-engine.test.js.map +1 -0
  119. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.d.ts +7 -0
  120. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js +201 -0
  121. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js.map +1 -0
  122. package/dist/src/cli/commands/check.js +18 -3
  123. package/dist/src/cli/commands/check.js.map +1 -1
  124. package/dist/src/cli/commands/dashboard.d.ts +1 -1
  125. package/dist/src/cli/commands/dashboard.js +343 -96
  126. package/dist/src/cli/commands/dashboard.js.map +1 -1
  127. package/dist/src/cli/commands/gateway.d.ts +1 -0
  128. package/dist/src/cli/commands/gateway.js +172 -0
  129. package/dist/src/cli/commands/gateway.js.map +1 -0
  130. package/dist/src/cli/commands/init/create-agent.js +3 -3
  131. package/dist/src/cli/commands/init/create-agent.js.map +1 -1
  132. package/dist/src/cli/commands/init/scaffold-core.d.ts +3 -1
  133. package/dist/src/cli/commands/init/scaffold-core.js +17 -2
  134. package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
  135. package/dist/src/cli/commands/init/scaffold-ops.js +2 -2
  136. package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -1
  137. package/dist/src/cli/commands/init/scaffold-standards.js +13 -1
  138. package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
  139. package/dist/src/cli/commands/init.d.ts +6 -0
  140. package/dist/src/cli/commands/init.js +163 -25
  141. package/dist/src/cli/commands/init.js.map +1 -1
  142. package/dist/src/cli/commands/mcp.d.ts +7 -0
  143. package/dist/src/cli/commands/mcp.js +45 -22
  144. package/dist/src/cli/commands/mcp.js.map +1 -1
  145. package/dist/src/cli/commands/orchestrate.d.ts +8 -7
  146. package/dist/src/cli/commands/orchestrate.js +2 -1
  147. package/dist/src/cli/commands/orchestrate.js.map +1 -1
  148. package/dist/src/cli/commands/quickstart.d.ts +5 -5
  149. package/dist/src/cli/commands/quickstart.js +30 -42
  150. package/dist/src/cli/commands/quickstart.js.map +1 -1
  151. package/dist/src/cli/index.js +228 -317
  152. package/dist/src/cli/index.js.map +1 -1
  153. package/dist/src/cli/platforms/core.d.ts +12 -0
  154. package/dist/src/cli/platforms/core.js +73 -0
  155. package/dist/src/cli/platforms/core.js.map +1 -0
  156. package/dist/src/cli/platforms/index.d.ts +5 -0
  157. package/dist/src/cli/platforms/index.js +6 -0
  158. package/dist/src/cli/platforms/index.js.map +1 -0
  159. package/dist/src/cli/platforms/paths.d.ts +15 -0
  160. package/dist/src/cli/platforms/paths.js +102 -0
  161. package/dist/src/cli/platforms/paths.js.map +1 -0
  162. package/dist/src/cli/platforms/scaffold.d.ts +2 -0
  163. package/dist/src/cli/platforms/scaffold.js +73 -0
  164. package/dist/src/cli/platforms/scaffold.js.map +1 -0
  165. package/dist/src/cli/platforms/utils.d.ts +4 -0
  166. package/dist/src/cli/platforms/utils.js +76 -0
  167. package/dist/src/cli/platforms/utils.js.map +1 -0
  168. package/dist/src/cli/shims.js +11 -11
  169. package/dist/src/cli/utils/fs.d.ts +1 -1
  170. package/dist/src/cli/utils/fs.js +1 -1
  171. package/dist/src/cli/utils/fs.js.map +1 -1
  172. package/dist/src/cli/utils/pkg.js +2 -3
  173. package/dist/src/cli/utils/pkg.js.map +1 -1
  174. package/dist/src/cli/utils/quality.d.ts +10 -0
  175. package/dist/src/cli/utils/quality.js +10 -0
  176. package/dist/src/cli/utils/quality.js.map +1 -0
  177. package/dist/src/modules/agents/definitions.d.ts +2 -2
  178. package/dist/src/modules/agents/definitions.js +104 -63
  179. package/dist/src/modules/agents/definitions.js.map +1 -1
  180. package/dist/src/modules/agents/registry/manager.js +6 -1
  181. package/dist/src/modules/agents/registry/manager.js.map +1 -1
  182. package/dist/src/modules/contracts/api.d.ts +178 -0
  183. package/dist/src/modules/contracts/api.js +56 -0
  184. package/dist/src/modules/contracts/api.js.map +1 -0
  185. package/dist/src/modules/contracts/index.d.ts +5 -0
  186. package/dist/src/modules/contracts/index.js +6 -0
  187. package/dist/src/modules/contracts/index.js.map +1 -0
  188. package/dist/src/modules/engines/agent-executor.d.ts +25 -30
  189. package/dist/src/modules/engines/agent-executor.js +133 -73
  190. package/dist/src/modules/engines/agent-executor.js.map +1 -1
  191. package/dist/src/modules/engines/agent-loop.d.ts +34 -0
  192. package/dist/src/modules/engines/agent-loop.js +102 -0
  193. package/dist/src/modules/engines/agent-loop.js.map +1 -0
  194. package/dist/src/modules/engines/evaluation-engine.js +2 -2
  195. package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
  196. package/dist/src/modules/engines/quality-gate.d.ts +16 -8
  197. package/dist/src/modules/engines/quality-gate.js +42 -34
  198. package/dist/src/modules/engines/quality-gate.js.map +1 -1
  199. package/dist/src/modules/engines/routing-engine.d.ts +21 -28
  200. package/dist/src/modules/engines/routing-engine.js +83 -50
  201. package/dist/src/modules/engines/routing-engine.js.map +1 -1
  202. package/dist/src/modules/gateway/circuit-breaker.d.ts +40 -0
  203. package/dist/src/modules/gateway/circuit-breaker.js +163 -0
  204. package/dist/src/modules/gateway/circuit-breaker.js.map +1 -0
  205. package/dist/src/modules/gateway/cost-tracker.d.ts +60 -0
  206. package/dist/src/modules/gateway/cost-tracker.js +198 -0
  207. package/dist/src/modules/gateway/cost-tracker.js.map +1 -0
  208. package/dist/src/modules/gateway/gateway.d.ts +72 -0
  209. package/dist/src/modules/gateway/gateway.js +243 -0
  210. package/dist/src/modules/gateway/gateway.js.map +1 -0
  211. package/dist/src/modules/gateway/index.d.ts +19 -0
  212. package/dist/src/modules/gateway/index.js +19 -0
  213. package/dist/src/modules/gateway/index.js.map +1 -0
  214. package/dist/src/modules/gateway/load-balancer.d.ts +86 -0
  215. package/dist/src/modules/gateway/load-balancer.js +230 -0
  216. package/dist/src/modules/gateway/load-balancer.js.map +1 -0
  217. package/dist/src/modules/gateway/providers/anthropic.d.ts +14 -0
  218. package/dist/src/modules/gateway/providers/anthropic.js +169 -0
  219. package/dist/src/modules/gateway/providers/anthropic.js.map +1 -0
  220. package/dist/src/modules/gateway/providers/base.d.ts +38 -0
  221. package/dist/src/modules/gateway/providers/base.js +42 -0
  222. package/dist/src/modules/gateway/providers/base.js.map +1 -0
  223. package/dist/src/modules/gateway/providers/google.d.ts +18 -0
  224. package/dist/src/modules/gateway/providers/google.js +176 -0
  225. package/dist/src/modules/gateway/providers/google.js.map +1 -0
  226. package/dist/src/modules/gateway/providers/grok.d.ts +14 -0
  227. package/dist/src/modules/gateway/providers/grok.js +166 -0
  228. package/dist/src/modules/gateway/providers/grok.js.map +1 -0
  229. package/dist/src/modules/gateway/providers/index.d.ts +21 -0
  230. package/dist/src/modules/gateway/providers/index.js +38 -0
  231. package/dist/src/modules/gateway/providers/index.js.map +1 -0
  232. package/dist/src/modules/gateway/providers/ollama.d.ts +23 -0
  233. package/dist/src/modules/gateway/providers/ollama.js +187 -0
  234. package/dist/src/modules/gateway/providers/ollama.js.map +1 -0
  235. package/dist/src/modules/gateway/providers/openai.d.ts +14 -0
  236. package/dist/src/modules/gateway/providers/openai.js +170 -0
  237. package/dist/src/modules/gateway/providers/openai.js.map +1 -0
  238. package/dist/src/modules/gateway/rate-limiter.d.ts +41 -0
  239. package/dist/src/modules/gateway/rate-limiter.js +119 -0
  240. package/dist/src/modules/gateway/rate-limiter.js.map +1 -0
  241. package/dist/src/modules/gateway/types.d.ts +114 -0
  242. package/dist/src/modules/gateway/types.js +8 -0
  243. package/dist/src/modules/gateway/types.js.map +1 -0
  244. package/dist/src/modules/memory/core.d.ts +4 -12
  245. package/dist/src/modules/memory/core.js +10 -17
  246. package/dist/src/modules/memory/core.js.map +1 -1
  247. package/dist/src/modules/memory/embedding.d.ts +28 -0
  248. package/dist/src/modules/memory/embedding.js +131 -0
  249. package/dist/src/modules/memory/embedding.js.map +1 -0
  250. package/dist/src/modules/providers/definitions.d.ts +9 -0
  251. package/dist/src/modules/providers/definitions.js +141 -0
  252. package/dist/src/modules/providers/definitions.js.map +1 -0
  253. package/dist/src/modules/providers/registry.d.ts +12 -0
  254. package/dist/src/modules/providers/registry.js +19 -0
  255. package/dist/src/modules/providers/registry.js.map +1 -0
  256. package/dist/src/modules/providers/shared.d.ts +1 -0
  257. package/dist/src/modules/providers/shared.js +105 -0
  258. package/dist/src/modules/providers/shared.js.map +1 -0
  259. package/dist/src/modules/providers/types.d.ts +14 -0
  260. package/dist/src/modules/providers/types.js +2 -0
  261. package/dist/src/modules/providers/types.js.map +1 -0
  262. package/dist/src/modules/skills/adapter-skills.d.ts +68 -0
  263. package/dist/src/modules/skills/adapter-skills.js +450 -0
  264. package/dist/src/modules/skills/adapter-skills.js.map +1 -0
  265. package/dist/src/shared/audit.d.ts +105 -0
  266. package/dist/src/shared/audit.js +221 -0
  267. package/dist/src/shared/audit.js.map +1 -0
  268. package/dist/src/shared/fs.js +4 -2
  269. package/dist/src/shared/fs.js.map +1 -1
  270. package/dist/src/shared/lock.d.ts +82 -0
  271. package/dist/src/shared/lock.js +160 -0
  272. package/dist/src/shared/lock.js.map +1 -0
  273. package/dist/src/shared/logger.d.ts +2 -0
  274. package/dist/src/shared/logger.js +15 -5
  275. package/dist/src/shared/logger.js.map +1 -1
  276. package/dist/src/shared/pii.d.ts +69 -0
  277. package/dist/src/shared/pii.js +213 -0
  278. package/dist/src/shared/pii.js.map +1 -0
  279. package/dist/src/shared/retention.d.ts +63 -0
  280. package/dist/src/shared/retention.js +171 -0
  281. package/dist/src/shared/retention.js.map +1 -0
  282. package/dist/src/shared/storage.d.ts +22 -1
  283. package/dist/src/shared/storage.js +49 -7
  284. package/dist/src/shared/storage.js.map +1 -1
  285. package/dist/tests/adapter.test.js +1 -1
  286. package/dist/tests/adapter.test.js.map +1 -1
  287. package/dist/tests/adapters/paths.test.js +4 -4
  288. package/dist/tests/adapters/paths.test.js.map +1 -1
  289. package/dist/tests/cli/commands/dashboard-coverage.test.d.ts +1 -0
  290. package/dist/tests/cli/commands/dashboard-coverage.test.js +88 -0
  291. package/dist/tests/cli/commands/dashboard-coverage.test.js.map +1 -0
  292. package/dist/tests/cli/init/adapter_init.test.js +4 -5
  293. package/dist/tests/cli/init/adapter_init.test.js.map +1 -1
  294. package/dist/tests/cli/init/unified_init.test.js +5 -7
  295. package/dist/tests/cli/init/unified_init.test.js.map +1 -1
  296. package/dist/tests/embedding.test.d.ts +1 -0
  297. package/dist/tests/embedding.test.js +82 -0
  298. package/dist/tests/embedding.test.js.map +1 -0
  299. package/dist/tests/engines/evaluation-engine.test.d.ts +1 -0
  300. package/dist/tests/engines/evaluation-engine.test.js +71 -0
  301. package/dist/tests/engines/evaluation-engine.test.js.map +1 -0
  302. package/dist/tests/engines/planning-engine.test.d.ts +1 -0
  303. package/dist/tests/engines/planning-engine.test.js +100 -0
  304. package/dist/tests/engines/planning-engine.test.js.map +1 -0
  305. package/dist/tests/engines/quality-gate.test.d.ts +1 -0
  306. package/dist/tests/engines/quality-gate.test.js +59 -0
  307. package/dist/tests/engines/quality-gate.test.js.map +1 -0
  308. package/dist/tests/engines/risk-engine.test.d.ts +1 -0
  309. package/dist/tests/engines/risk-engine.test.js +80 -0
  310. package/dist/tests/engines/risk-engine.test.js.map +1 -0
  311. package/dist/tests/engines/routing-engine.test.d.ts +1 -0
  312. package/dist/tests/engines/routing-engine.test.js +78 -0
  313. package/dist/tests/engines/routing-engine.test.js.map +1 -0
  314. package/dist/tests/integration/agent_flow.test.js +14 -8
  315. package/dist/tests/integration/agent_flow.test.js.map +1 -1
  316. package/dist/tests/integration/hermes_locking.test.js +1 -0
  317. package/dist/tests/integration/hermes_locking.test.js.map +1 -1
  318. package/dist/tests/modules/adapters/adapters.test.js +2 -2
  319. package/dist/tests/modules/adapters/adapters.test.js.map +1 -1
  320. package/dist/tests/modules/contracts/contracts.test.d.ts +1 -0
  321. package/dist/tests/modules/contracts/contracts.test.js +73 -0
  322. package/dist/tests/modules/contracts/contracts.test.js.map +1 -0
  323. package/dist/tests/modules/engines/agent-executor.test.js +30 -23
  324. package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
  325. package/dist/tests/modules/gateway/circuit-breaker.test.d.ts +1 -0
  326. package/dist/tests/modules/gateway/circuit-breaker.test.js +124 -0
  327. package/dist/tests/modules/gateway/circuit-breaker.test.js.map +1 -0
  328. package/dist/tests/modules/gateway/cost-tracker.test.d.ts +1 -0
  329. package/dist/tests/modules/gateway/cost-tracker.test.js +93 -0
  330. package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -0
  331. package/dist/tests/modules/gateway/load-balancer.test.d.ts +1 -0
  332. package/dist/tests/modules/gateway/load-balancer.test.js +70 -0
  333. package/dist/tests/modules/gateway/load-balancer.test.js.map +1 -0
  334. package/dist/tests/modules/gateway/rate-limiter.test.d.ts +1 -0
  335. package/dist/tests/modules/gateway/rate-limiter.test.js +62 -0
  336. package/dist/tests/modules/gateway/rate-limiter.test.js.map +1 -0
  337. package/dist/tests/orchestrator-dependencies.test.js +23 -6
  338. package/dist/tests/orchestrator-dependencies.test.js.map +1 -1
  339. package/dist/tests/shared/audit.test.d.ts +1 -0
  340. package/dist/tests/shared/audit.test.js +53 -0
  341. package/dist/tests/shared/audit.test.js.map +1 -0
  342. package/dist/tests/shared/lock.test.d.ts +1 -0
  343. package/dist/tests/shared/lock.test.js +95 -0
  344. package/dist/tests/shared/lock.test.js.map +1 -0
  345. package/dist/tests/shared/pii.test.d.ts +1 -0
  346. package/dist/tests/shared/pii.test.js +183 -0
  347. package/dist/tests/shared/pii.test.js.map +1 -0
  348. package/dist/tests/storage-operations.test.d.ts +1 -0
  349. package/dist/tests/storage-operations.test.js +116 -0
  350. package/dist/tests/storage-operations.test.js.map +1 -0
  351. package/framework-mcp/README.md +596 -77
  352. package/framework-mcp/dist/dashboard/assets/index-B2mYld0c.js +1221 -0
  353. package/framework-mcp/dist/dashboard/index.html +15 -0
  354. package/framework-mcp/dist/framework-mcp/src/index.js +914 -62
  355. package/framework-mcp/dist/framework-mcp/src/tools/compliance/mask_pii.js +55 -0
  356. package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +24 -1
  357. package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  358. package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_query.js +137 -0
  359. package/framework-mcp/dist/framework-mcp/src/tools/gateway/llm_gateway_status.js +90 -0
  360. package/framework-mcp/dist/framework-mcp/src/tools/index.js +34 -20
  361. package/framework-mcp/dist/framework-mcp/src/tools/messaging/approve_operation.js +80 -0
  362. package/framework-mcp/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  363. package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +3 -1
  364. package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +114 -0
  365. package/framework-mcp/dist/framework-mcp/src/tools/quality/check_architecture_compliance.js +134 -0
  366. package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +32 -7
  367. package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +12 -2
  368. package/framework-mcp/dist/framework-mcp/src/tools/types.js +1 -0
  369. package/framework-mcp/dist/framework-mcp/src/utils/auth.js +78 -0
  370. package/framework-mcp/dist/framework-mcp/src/utils/auto-rollback.js +265 -0
  371. package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +12 -4
  372. package/framework-mcp/dist/framework-mcp/src/utils/context-optimizer.js +156 -0
  373. package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +217 -0
  374. package/framework-mcp/dist/framework-mcp/src/utils/finops.js +325 -0
  375. package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +215 -0
  376. package/framework-mcp/dist/framework-mcp/src/utils/license-scanner.js +283 -0
  377. package/framework-mcp/dist/framework-mcp/src/utils/loop-detector.js +361 -0
  378. package/framework-mcp/dist/framework-mcp/src/utils/quality.js +123 -0
  379. package/framework-mcp/dist/framework-mcp/src/utils/rules-engine.js +231 -0
  380. package/framework-mcp/dist/framework-mcp/src/utils/silent-router.js +128 -0
  381. package/framework-mcp/dist/framework-mcp/src/utils/storage.js +2 -2
  382. package/framework-mcp/dist/framework-mcp/src/utils/telemetry-streamer.js +396 -0
  383. package/framework-mcp/dist/src/cli/platforms/core.js +72 -0
  384. package/framework-mcp/dist/src/cli/platforms/index.js +5 -0
  385. package/framework-mcp/dist/src/cli/platforms/paths.js +101 -0
  386. package/framework-mcp/dist/src/cli/platforms/scaffold.js +72 -0
  387. package/framework-mcp/dist/src/cli/platforms/utils.js +75 -0
  388. package/framework-mcp/dist/src/cli/utils/claude.js +57 -0
  389. package/framework-mcp/dist/src/cli/utils/compliance.js +12 -0
  390. package/framework-mcp/dist/src/cli/utils/fs.js +138 -0
  391. package/framework-mcp/dist/src/cli/utils/pkg.js +282 -0
  392. package/framework-mcp/dist/src/cli/utils/quality.js +9 -0
  393. package/framework-mcp/dist/src/modules/agents/definitions.js +563 -0
  394. package/framework-mcp/dist/src/modules/agents/registry/analyst.js +39 -0
  395. package/framework-mcp/dist/src/modules/agents/registry/architect.js +42 -0
  396. package/framework-mcp/dist/src/modules/agents/registry/backend.js +50 -0
  397. package/framework-mcp/dist/src/modules/agents/registry/database.js +45 -0
  398. package/framework-mcp/dist/src/modules/agents/registry/devops.js +45 -0
  399. package/framework-mcp/dist/src/modules/agents/registry/explorer.js +37 -0
  400. package/framework-mcp/dist/src/modules/agents/registry/frontend.js +52 -0
  401. package/framework-mcp/dist/src/modules/agents/registry/git.js +36 -0
  402. package/framework-mcp/dist/src/modules/agents/registry/manager.js +64 -0
  403. package/framework-mcp/dist/src/modules/agents/registry/mobile.js +41 -0
  404. package/framework-mcp/dist/src/modules/agents/registry/native.js +41 -0
  405. package/framework-mcp/dist/src/modules/agents/registry/quality.js +43 -0
  406. package/framework-mcp/dist/src/modules/agents/registry/security.js +42 -0
  407. package/framework-mcp/dist/src/modules/agents/types.js +1 -0
  408. package/framework-mcp/dist/src/modules/engines/quality-gate.js +92 -0
  409. package/framework-mcp/dist/src/modules/engines/risk-engine.js +105 -0
  410. package/framework-mcp/dist/src/modules/engines/routing-engine.js +408 -0
  411. package/framework-mcp/dist/src/modules/engines/types.js +1 -0
  412. package/framework-mcp/dist/src/modules/memory/core.js +10 -17
  413. package/framework-mcp/dist/src/modules/memory/embedding.js +130 -0
  414. package/framework-mcp/dist/src/modules/providers/definitions.js +140 -0
  415. package/framework-mcp/dist/src/modules/providers/registry.js +18 -0
  416. package/framework-mcp/dist/src/modules/providers/shared.js +104 -0
  417. package/framework-mcp/dist/src/modules/providers/types.js +1 -0
  418. package/framework-mcp/dist/src/modules/skills/adapter-skills.js +449 -0
  419. package/framework-mcp/dist/src/modules/skills/definitions.js +70 -0
  420. package/framework-mcp/dist/src/shared/audit.js +220 -0
  421. package/framework-mcp/dist/src/shared/errors.js +68 -0
  422. package/framework-mcp/dist/src/shared/fs.js +4 -2
  423. package/framework-mcp/dist/src/shared/lock.js +159 -0
  424. package/framework-mcp/dist/src/shared/logger.js +15 -5
  425. package/framework-mcp/dist/src/shared/pii.js +212 -0
  426. package/framework-mcp/dist/src/shared/retention.js +170 -0
  427. package/framework-mcp/dist/src/shared/storage.js +49 -7
  428. package/framework-mcp/dist/src/shared/string.js +29 -0
  429. package/framework-mcp/package.json +8 -2
  430. package/mcp.json +11 -6
  431. package/package.json +22 -9
  432. package/templates/full/ATABEY_FULL.md +515 -0
@@ -0,0 +1,55 @@
1
+ import { classifyData, containsPII, maskObject, maskText } from "../../../../src/shared/pii.js";
2
+ export function handleMaskPII(root, args) {
3
+ const mode = args.mode || "auto";
4
+ const strictMode = args.strictMode ?? false;
5
+ // Mode: text
6
+ if (mode === "text" || (mode === "auto" && args.text && !args.data)) {
7
+ if (!args.text) {
8
+ return {
9
+ isError: true,
10
+ content: [{ type: "text", text: "[ERROR] 'text' parameter is required when mode is 'text'." }],
11
+ };
12
+ }
13
+ const masked = maskText(args.text);
14
+ const hasPII = containsPII(args.text);
15
+ const classification = classifyData(args.text);
16
+ return {
17
+ content: [{
18
+ type: "text",
19
+ text: JSON.stringify({
20
+ originalLength: args.text.length,
21
+ maskedLength: masked.length,
22
+ hasPII,
23
+ classification,
24
+ masked,
25
+ }, null, 2),
26
+ }],
27
+ };
28
+ }
29
+ // Mode: object
30
+ if (mode === "object" || (mode === "auto" && args.data)) {
31
+ if (!args.data) {
32
+ return {
33
+ isError: true,
34
+ content: [{ type: "text", text: "[ERROR] 'data' parameter is required when mode is 'object'." }],
35
+ };
36
+ }
37
+ const masked = maskObject(args.data, 0, strictMode);
38
+ const hasPII = containsPII(JSON.stringify(args.data));
39
+ const classification = classifyData(JSON.stringify(args.data));
40
+ return {
41
+ content: [{
42
+ type: "text",
43
+ text: JSON.stringify({
44
+ hasPII,
45
+ classification,
46
+ masked,
47
+ }, null, 2),
48
+ }],
49
+ };
50
+ }
51
+ return {
52
+ isError: true,
53
+ content: [{ type: "text", text: "[ERROR] Provide either 'text' (string) or 'data' (object) parameter." }],
54
+ };
55
+ }
@@ -1,5 +1,5 @@
1
- import * as schemas from "./schemas.js";
2
1
  import { zodToMcpSchema } from "../utils/zod-to-mcp.js";
2
+ import * as schemas from "./schemas.js";
3
3
  /**
4
4
  * ─── SUPREME TOOL REGISTRY ─────────────────────────────────────────
5
5
  * Every tool is dynamically generated from its Zod schema.
@@ -172,4 +172,27 @@ export const TOOLS = [
172
172
  description: "Pause execution and ask the human developer a clarifying question via the terminal.",
173
173
  inputSchema: zodToMcpSchema(schemas.AskHumanSchema),
174
174
  },
175
+ // ─── PII / Compliance ─────────────────────────────────────────
176
+ {
177
+ name: "mask_pii",
178
+ description: "Mask Personally Identifiable Information (PII) in text or structured data. Compliant with KVKK (Law No. 6698) and GDPR. Detects and masks emails, phone numbers, TC IDs, API keys, tokens, IPs, credit cards, IBANs, and more.",
179
+ inputSchema: zodToMcpSchema(schemas.MaskPIISchema),
180
+ },
181
+ // ─── Code Quality ─────────────────────────────────────────────
182
+ {
183
+ name: "analyze_code_quality",
184
+ description: "Analyze code quality in a given path. Checks TypeScript types, lint rules, and code complexity.",
185
+ inputSchema: zodToMcpSchema(schemas.AnalyzeCodeQualitySchema),
186
+ },
187
+ {
188
+ name: "check_architecture_compliance",
189
+ description: "Check architecture compliance in a given path. Verifies layer boundaries (Controller→Service→Repository), import direction rules, and strict mode.",
190
+ inputSchema: zodToMcpSchema(schemas.CheckArchitectureComplianceSchema),
191
+ },
192
+ // ─── Human-in-the-Loop ────────────────────────────────────────
193
+ {
194
+ name: "approve_operation",
195
+ description: "Approve, reject, or list pending risk-gated operations. Use this when an operation was blocked by the Risk Gate (risk score ≥ 60). Action: 'approve' | 'reject' | 'list'.",
196
+ inputSchema: zodToMcpSchema(schemas.ApproveOperationSchema),
197
+ },
175
198
  ];
@@ -1,11 +1,36 @@
1
1
  import { execSync } from "child_process";
2
2
  import { getBackendLanguage, getDefaultTestCommand } from "../../utils/cli.js";
3
+ const TEST_COMMAND_ALLOW_LIST = [
4
+ "npm test",
5
+ "npm run test",
6
+ "npx vitest",
7
+ "pytest",
8
+ "go test",
9
+ "dotnet test",
10
+ "mvn test",
11
+ "./gradlew test",
12
+ "cargo test"
13
+ ];
3
14
  /**
4
15
  * Executes project tests and returns results for agent analysis.
5
16
  */
6
17
  export function handleRunTests(projectRoot, args) {
7
18
  const language = getBackendLanguage(projectRoot);
8
19
  const testCommand = args.command || getDefaultTestCommand(language);
20
+ // Validate command to prevent shell injection / chaining
21
+ const isAllowed = TEST_COMMAND_ALLOW_LIST.some(allowedCmd => testCommand.startsWith(allowedCmd));
22
+ if (!isAllowed) {
23
+ return {
24
+ isError: true,
25
+ content: [{ type: "text", text: `[ERROR] Test command not allowed: "${testCommand}". Must start with one of: ${TEST_COMMAND_ALLOW_LIST.join(", ")}` }]
26
+ };
27
+ }
28
+ if (/[;&|><$`\n\r]/.test(testCommand)) {
29
+ return {
30
+ isError: true,
31
+ content: [{ type: "text", text: "[ERROR] Test command rejected: Shell metacharacters are forbidden to prevent command injection." }]
32
+ };
33
+ }
9
34
  try {
10
35
  const output = execSync(testCommand, { cwd: projectRoot, encoding: "utf8", stdio: "pipe" });
11
36
  return {
@@ -0,0 +1,137 @@
1
+ /**
2
+ * ATABEY MCP Tool — LLM Gateway Query
3
+ *
4
+ * Sends a chat completion request through the ATABEY LLM Gateway.
5
+ * The gateway automatically selects the best provider based on the
6
+ * configured load balancing strategy (failover, round-robin, cost-optimized, etc.)
7
+ *
8
+ * This tool allows ANY MCP-connected AI (Gemini CLI, Claude CLI, Cursor, Grok, etc.)
9
+ * to route LLM requests through the gateway to any supported provider.
10
+ *
11
+ * The gateway module is loaded dynamically from the project root at runtime,
12
+ * not at compile time (since it lives outside the MCP workspace).
13
+ */
14
+ import path from "path";
15
+ /**
16
+ * Dynamically load the LLM Gateway from the project root.
17
+ * Falls back gracefully if the gateway module is not available.
18
+ */
19
+ async function loadGateway(projectRoot) {
20
+ try {
21
+ const gatewayPath = path.join(projectRoot, "dist/src/modules/gateway/index.js");
22
+ const mod = await import(gatewayPath);
23
+ return mod.gateway;
24
+ }
25
+ catch {
26
+ try {
27
+ // Fallback: try tsx resolution for development
28
+ const gatewayPath = path.join(projectRoot, "src/modules/gateway/index.ts");
29
+ const mod = await import(gatewayPath);
30
+ return mod.gateway;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ }
37
+ /**
38
+ * Handle llm_gateway_query tool call.
39
+ * Routes the request through the LLM Gateway with load balancing.
40
+ */
41
+ export async function handleLLMGatewayQuery(projectRoot, args) {
42
+ const startTime = Date.now();
43
+ try {
44
+ // Load gateway dynamically
45
+ const gateway = await loadGateway(projectRoot);
46
+ if (!gateway) {
47
+ return {
48
+ isError: true,
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: JSON.stringify({
53
+ success: false,
54
+ error: "LLM Gateway is not initialized. The project may need to be built first. " +
55
+ "Run: npm run build:core",
56
+ solution: "Gateway module not found at dist/src/modules/gateway/index.js. " +
57
+ "Ensure the main package is built and ATABEY_PROJECT_ROOT is set correctly.",
58
+ }, null, 2),
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ // Build gateway request
64
+ const gatewayRequest = {
65
+ messages: args.messages.map(m => ({
66
+ role: m.role,
67
+ content: m.content,
68
+ })),
69
+ system: args.system,
70
+ model: args.model,
71
+ temperature: args.temperature ?? 0.7,
72
+ maxTokens: args.maxTokens ?? 4096,
73
+ traceId: args.traceId || `MCP-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`,
74
+ };
75
+ // Provider override
76
+ if (args.provider) {
77
+ gatewayRequest.provider = args.provider;
78
+ }
79
+ // Strategy override
80
+ if (args.strategy) {
81
+ gatewayRequest.strategy = args.strategy;
82
+ }
83
+ // Send through gateway
84
+ const response = await gateway.chat(gatewayRequest);
85
+ const elapsed = Date.now() - startTime;
86
+ if (response.success) {
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: JSON.stringify({
92
+ success: true,
93
+ content: response.content,
94
+ provider: response.provider,
95
+ model: response.model,
96
+ usage: response.usage,
97
+ latencyMs: response.latencyMs,
98
+ cost: response.cost,
99
+ traceId: response.traceId,
100
+ elapsed,
101
+ }, null, 2),
102
+ },
103
+ ],
104
+ };
105
+ }
106
+ return {
107
+ isError: true,
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: JSON.stringify({
112
+ success: false,
113
+ error: response.content,
114
+ provider: response.provider,
115
+ traceId: response.traceId,
116
+ elapsed,
117
+ }, null, 2),
118
+ },
119
+ ],
120
+ };
121
+ }
122
+ catch (error) {
123
+ return {
124
+ isError: true,
125
+ content: [
126
+ {
127
+ type: "text",
128
+ text: JSON.stringify({
129
+ success: false,
130
+ error: `Gateway query failed: ${error.message}`,
131
+ elapsed: Date.now() - startTime,
132
+ }, null, 2),
133
+ },
134
+ ],
135
+ };
136
+ }
137
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * ATABEY MCP Tool — LLM Gateway Status
3
+ *
4
+ * Returns the current status of the LLM Gateway, including provider health,
5
+ * current load balancing strategy, usage statistics, and budget info.
6
+ *
7
+ * Useful for monitoring and debugging gateway behavior without CLI access.
8
+ */
9
+ import path from "path";
10
+ /**
11
+ * Dynamically load the LLM Gateway from the project root.
12
+ */
13
+ async function loadGateway(projectRoot) {
14
+ try {
15
+ const gatewayPath = path.join(projectRoot, "dist/src/modules/gateway/index.js");
16
+ const mod = await import(gatewayPath);
17
+ return mod.gateway;
18
+ }
19
+ catch {
20
+ try {
21
+ const gatewayPath = path.join(projectRoot, "src/modules/gateway/index.ts");
22
+ const mod = await import(gatewayPath);
23
+ return mod.gateway;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * Handle llm_gateway_status tool call.
32
+ */
33
+ export async function handleLLMGatewayStatus(projectRoot, args) {
34
+ const detail = args.detail || "overview";
35
+ try {
36
+ const gateway = await loadGateway(projectRoot);
37
+ if (!gateway) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: JSON.stringify({
43
+ status: "unavailable",
44
+ message: "LLM Gateway is not initialized. " +
45
+ "Build the project first with: npm run build:core",
46
+ }, null, 2),
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ const result = {
52
+ status: "active",
53
+ strategy: gateway.loadBalancer.getStrategy(),
54
+ };
55
+ if (detail === "providers" || detail === "overview") {
56
+ result.providers = gateway.getProviderHealth();
57
+ }
58
+ if (detail === "stats" || detail === "overview") {
59
+ result.stats = gateway.getStats();
60
+ }
61
+ if (detail === "overview" || detail === "stats") {
62
+ const budget = gateway.costTracker.getBudgetStatus();
63
+ if (budget) {
64
+ result.budget = budget;
65
+ }
66
+ }
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: JSON.stringify(result, null, 2),
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ isError: true,
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: JSON.stringify({
83
+ status: "error",
84
+ error: `Failed to get gateway status: ${error.message}`,
85
+ }, null, 2),
86
+ },
87
+ ],
88
+ };
89
+ }
90
+ }
@@ -1,35 +1,39 @@
1
+ import { handleMaskPII } from "./compliance/mask_pii.js";
2
+ import { handleAcquireLock, handleReleaseLock } from "./control_plane/locking.js";
3
+ import { handleRegisterAgent } from "./control_plane/registry.js";
1
4
  import { TOOLS } from "./definitions.js";
2
- import { handleReadFile } from "./file_system/read_file.js";
3
- import { handleWriteFile } from "./file_system/write_file.js";
4
- import { handleReplaceText } from "./file_system/replace_text.js";
5
5
  import { handleBatchSurgicalEdit } from "./file_system/batch_surgical_edit.js";
6
6
  import { handlePatchFile } from "./file_system/patch_file.js";
7
- import { handleGrepSearch } from "./search/grep_search.js";
8
- import { handleListDir } from "./search/list_dir.js";
9
- import { handleGetProjectGaps } from "./search/get_gaps.js";
10
- import { handleGetProjectMap } from "./search/get_map.js";
11
- import { handleGetFrameworkStatus } from "./framework/get_status.js";
12
- import { handleUpdateProjectMemory } from "./framework/update_memory.js";
7
+ import { handleReadFile } from "./file_system/read_file.js";
8
+ import { handleReplaceText } from "./file_system/replace_text.js";
9
+ import { handleWriteFile } from "./file_system/write_file.js";
13
10
  import { handleAuditDependencies } from "./framework/audit_deps.js";
14
- import { handleRunTests } from "./framework/run_tests.js";
15
- import { handleGetSystemHealth } from "./observability/get_health.js";
16
- import { handleCheckPorts } from "./observability/check_ports.js";
11
+ import { handleGetFrameworkStatus } from "./framework/get_status.js";
17
12
  import { handleOrchestrateLoop } from "./framework/orchestrate.js";
13
+ import { handleRunTests } from "./framework/run_tests.js";
18
14
  import { handleSubmitPlan } from "./framework/submit_plan.js";
19
15
  import { handleUpdateContractHash } from "./framework/update_contract_hash.js";
20
- import { handleReadProjectMemory } from "./memory/read_memory.js";
16
+ import { handleUpdateProjectMemory } from "./framework/update_memory.js";
17
+ import { handleDeleteKnowledge } from "./memory/delete_knowledge.js";
21
18
  import { handleGetMemoryInsights } from "./memory/get_insights.js";
22
- import { handleStoreKnowledge } from "./memory/store_knowledge.js";
19
+ import { handleReadProjectMemory } from "./memory/read_memory.js";
23
20
  import { handleSearchKnowledge } from "./memory/search_knowledge.js";
24
- import { handleDeleteKnowledge } from "./memory/delete_knowledge.js";
25
- import { handleSendAgentMessage } from "./messaging/send_message.js";
26
- import { handleLogAgentAction } from "./messaging/log_action.js";
21
+ import { handleStoreKnowledge } from "./memory/store_knowledge.js";
27
22
  import { handleAskHuman } from "./messaging/ask_human.js";
28
- import { handleAcquireLock, handleReleaseLock } from "./control_plane/locking.js";
29
- import { handleRegisterAgent } from "./control_plane/registry.js";
30
- import { handleRunCommand } from "./shell/run_command.js";
23
+ import { handleApproveOperation } from "./messaging/approve_operation.js";
24
+ import { handleLogAgentAction } from "./messaging/log_action.js";
25
+ import { handleSendAgentMessage } from "./messaging/send_message.js";
26
+ import { handleCheckPorts } from "./observability/check_ports.js";
27
+ import { handleGetSystemHealth } from "./observability/get_health.js";
28
+ import { handleAnalyzeCodeQuality } from "./quality/analyze_code_quality.js";
29
+ import { handleCheckArchitectureCompliance } from "./quality/check_architecture_compliance.js";
31
30
  import { handleCheckLint } from "./quality/check_lint.js";
32
31
  import * as schemas from "./schemas.js";
32
+ import { handleGetProjectGaps } from "./search/get_gaps.js";
33
+ import { handleGetProjectMap } from "./search/get_map.js";
34
+ import { handleGrepSearch } from "./search/grep_search.js";
35
+ import { handleListDir } from "./search/list_dir.js";
36
+ import { handleRunCommand } from "./shell/run_command.js";
33
37
  // Map of tool names to their handler functions
34
38
  const bind = (fn) => {
35
39
  return (root, args) => fn(root, args);
@@ -61,12 +65,16 @@ export const toolHandlers = {
61
65
  send_agent_message: bind(handleSendAgentMessage),
62
66
  log_agent_action: bind(handleLogAgentAction),
63
67
  ask_human: bind(handleAskHuman),
68
+ approve_operation: bind(handleApproveOperation),
64
69
  update_contract_hash: bind(handleUpdateContractHash),
65
70
  acquire_lock: bind(handleAcquireLock),
66
71
  release_lock: bind(handleReleaseLock),
67
72
  register_agent: bind(handleRegisterAgent),
68
73
  run_shell_command: bind(handleRunCommand),
69
74
  check_lint: bind(handleCheckLint),
75
+ analyze_code_quality: bind(handleAnalyzeCodeQuality),
76
+ check_architecture_compliance: bind(handleCheckArchitectureCompliance),
77
+ mask_pii: bind(handleMaskPII),
70
78
  };
71
79
  // Map of tool names to their Zod validation schemas
72
80
  export const toolSchemas = {
@@ -107,5 +115,11 @@ export const toolSchemas = {
107
115
  send_agent_message: schemas.SendAgentMessageSchema,
108
116
  log_agent_action: schemas.LogAgentActionSchema,
109
117
  ask_human: schemas.AskHumanSchema,
118
+ approve_operation: schemas.ApproveOperationSchema,
119
+ // Code Quality
120
+ analyze_code_quality: schemas.AnalyzeCodeQualitySchema,
121
+ check_architecture_compliance: schemas.CheckArchitectureComplianceSchema,
122
+ // PII / Compliance
123
+ mask_pii: schemas.MaskPIISchema,
110
124
  };
111
125
  export { TOOLS };
@@ -0,0 +1,80 @@
1
+ import { approveOperation, rejectOperation, getPendingApprovals } from "../../utils/human-in-loop.js";
2
+ /**
3
+ * ─── APPROVE OPERATION — In-Chat Risk Gate ──────────────────────────
4
+ *
5
+ * AI CLI kullanımında "atabey approve <traceId>" CLI komutu çalıştırmak mümkün
6
+ * değildir — chat'e yazılan şey CLI komutu olarak değil mesaj olarak işlenir.
7
+ *
8
+ * Bu tool, risk gate approval flow'unu doğrudan MCP tool çağrısına taşır:
9
+ *
10
+ * 1. Atabey yüksek riskli bir operasyonu bloklar
11
+ * 2. Geliştiriciye: "approve_operation tool'unu çağır" der
12
+ * 3. AI bu tool'u çağırır → operasyon onaylanır/reddedilir
13
+ *
14
+ * Geliştirici terminale geçmek zorunda kalmaz.
15
+ */
16
+ export async function handleApproveOperation(_root, args) {
17
+ const { action, traceId, reason } = args;
18
+ // LIST: Bekleyen approval'ları göster
19
+ if (action === "list") {
20
+ const pending = getPendingApprovals();
21
+ if (pending.length === 0) {
22
+ return {
23
+ content: [{ type: "text", text: "[APPROVALS] No pending operations waiting for approval." }],
24
+ };
25
+ }
26
+ const lines = [
27
+ `[APPROVALS] ${pending.length} pending operation(s):\n`,
28
+ ...pending.map(req => [
29
+ " ─────────────────────────────────────",
30
+ ` Trace ID: ${req.traceId}`,
31
+ ` Tool: ${req.toolName}`,
32
+ ` Agent: ${req.agent}`,
33
+ ` Risk Score: ${req.riskScore}/100 (${req.riskLevel})`,
34
+ ` Reason: ${req.reason}`,
35
+ ` Expires: ${new Date(req.expiresAt).toISOString()}`,
36
+ ].join("\n")),
37
+ "",
38
+ "To approve: call approve_operation with action=\"approve\" and traceId=\"<id>\"",
39
+ "To reject: call approve_operation with action=\"reject\" and traceId=\"<id>\"",
40
+ ];
41
+ return {
42
+ content: [{ type: "text", text: lines.join("\n") }],
43
+ };
44
+ }
45
+ // APPROVE or REJECT: traceId zorunlu
46
+ if (!traceId) {
47
+ return {
48
+ isError: true,
49
+ content: [{ type: "text", text: `[ERROR] traceId is required for "${action}" action.` }],
50
+ };
51
+ }
52
+ if (action === "approve") {
53
+ const result = approveOperation(traceId);
54
+ return {
55
+ content: [{
56
+ type: "text",
57
+ text: result.success
58
+ ? `[APPROVED] ✅ ${result.message}\nYou may retry the blocked operation now.`
59
+ : `[ERROR] ${result.message}`,
60
+ }],
61
+ isError: !result.success,
62
+ };
63
+ }
64
+ if (action === "reject") {
65
+ const result = rejectOperation(traceId);
66
+ return {
67
+ content: [{
68
+ type: "text",
69
+ text: result.success
70
+ ? `[REJECTED] ⛔ ${result.message}${reason ? `\nReason: ${reason}` : ""}`
71
+ : `[ERROR] ${result.message}`,
72
+ }],
73
+ isError: !result.success,
74
+ };
75
+ }
76
+ return {
77
+ isError: true,
78
+ content: [{ type: "text", text: `[ERROR] Unknown action: "${String(action)}". Use "approve", "reject", or "list".` }],
79
+ };
80
+ }
@@ -1,30 +1,99 @@
1
- import chalk from "chalk";
1
+ import fs from "fs";
2
+ import path from "path";
3
+ /**
4
+ * ─── ASK HUMAN — File Bridge ─────────────────────────────────────────
5
+ *
6
+ * AI CLI'lar (Claude Code, Gemini CLI) MCP server'ı stdio subprocess olarak
7
+ * başlatır. Bu subprocess'te stdin isTTY=false olur (MCP JSON-RPC için kullanılır).
8
+ *
9
+ * Çözüm: File-based Q&A bridge.
10
+ * 1. Soru → .atabey/hitl/question.txt dosyasına yazılır
11
+ * 2. Geliştirici `atabey hitl` komutuyla cevap girer
12
+ * 3. Cevap → .atabey/hitl/answer.txt dosyasına yazılır
13
+ * 4. Bu handler cevabı okur ve AI'ya döner
14
+ *
15
+ * Dashboard: /api/approvals endpoint'i üzerinden web dashboard'dan da cevaplanabilir.
16
+ */
2
17
  export async function handleAskHuman(root, args) {
3
- if (process.env.ATABEY_TEST_DIR || !process.stdin.isTTY) {
4
- return { content: [{ type: "text", text: "[SKIPPED] Non-interactive environment. Cannot ask human." }] };
5
- }
18
+ const timeoutSeconds = args.timeoutSeconds ?? 120;
19
+ const hitlDir = path.join(root, ".atabey", "hitl");
20
+ const questionFile = path.join(hitlDir, "question.txt");
21
+ const answerFile = path.join(hitlDir, "answer.txt");
6
22
  try {
7
- const readline = await import("readline");
8
- const rl = readline.createInterface({
9
- input: process.stdin,
10
- output: process.stdout
11
- });
12
- return new Promise((resolve) => {
13
- process.stdout.write("\n" + chalk.bgMagenta.white.bold(" [HUMAN-IN-THE-LOOP REQUIRED] ") + "\n");
14
- process.stdout.write(chalk.magenta("An agent has paused execution to ask you a question:\n"));
15
- rl.question(`\n${chalk.bold(args.question)}\n${chalk.gray("> ")}`, (answer) => {
16
- rl.close();
17
- resolve({
18
- content: [{ type: "text", text: `[HUMAN RESPONSE] ${answer}` }]
19
- });
20
- });
21
- });
23
+ // Ensure hitl directory exists
24
+ fs.mkdirSync(hitlDir, { recursive: true });
25
+ // Clear any stale answer file
26
+ if (fs.existsSync(answerFile)) {
27
+ fs.unlinkSync(answerFile);
28
+ }
29
+ // Write the question with metadata
30
+ const questionPayload = JSON.stringify({
31
+ timestamp: new Date().toISOString(),
32
+ question: args.question,
33
+ timeoutAt: new Date(Date.now() + timeoutSeconds * 1000).toISOString(),
34
+ }, null, 2);
35
+ fs.writeFileSync(questionFile, questionPayload);
36
+ // Write human-readable prompt file alongside
37
+ fs.writeFileSync(path.join(hitlDir, "PENDING.txt"), [
38
+ "═══════════════════════════════════════════════════",
39
+ " [ATABEY] AGENT WAITING FOR YOUR ANSWER",
40
+ "═══════════════════════════════════════════════════",
41
+ "",
42
+ `QUESTION: ${args.question}`,
43
+ "",
44
+ "To answer, run in your terminal:",
45
+ " atabey hitl answer \"your answer here\"",
46
+ "",
47
+ "Or use the dashboard: http://localhost:5858",
48
+ "═══════════════════════════════════════════════════",
49
+ ].join("\n"));
50
+ process.stderr.write(`[HITL] Question written to ${questionFile}\n`);
51
+ process.stderr.write("[HITL] Run: atabey hitl answer \"your answer\"\n");
52
+ // Poll for answer file
53
+ const pollIntervalMs = 1000;
54
+ const maxAttempts = timeoutSeconds;
55
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
56
+ await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
57
+ if (fs.existsSync(answerFile)) {
58
+ const answer = fs.readFileSync(answerFile, "utf8").trim();
59
+ // Clean up
60
+ try {
61
+ fs.unlinkSync(questionFile);
62
+ fs.unlinkSync(answerFile);
63
+ const pendingFile = path.join(hitlDir, "PENDING.txt");
64
+ if (fs.existsSync(pendingFile))
65
+ fs.unlinkSync(pendingFile);
66
+ }
67
+ catch { /* cleanup is best-effort */ }
68
+ process.stderr.write("[HITL] Answer received.\n");
69
+ return {
70
+ content: [{ type: "text", text: `[HUMAN RESPONSE] ${answer}` }],
71
+ };
72
+ }
73
+ }
74
+ // Timeout — clean up question file
75
+ try {
76
+ if (fs.existsSync(questionFile))
77
+ fs.unlinkSync(questionFile);
78
+ const pendingFile = path.join(hitlDir, "PENDING.txt");
79
+ if (fs.existsSync(pendingFile))
80
+ fs.unlinkSync(pendingFile);
81
+ }
82
+ catch { /* cleanup is best-effort */ }
83
+ return {
84
+ content: [{
85
+ type: "text",
86
+ text: `[HITL TIMEOUT] No answer received within ${timeoutSeconds}s.\n` +
87
+ `Question was: "${args.question}"\n` +
88
+ "To answer pending questions, run: atabey hitl answer \"your answer\"",
89
+ }],
90
+ };
22
91
  }
23
92
  catch (error) {
24
93
  const message = error instanceof Error ? error.message : String(error);
25
94
  return {
26
95
  isError: true,
27
- content: [{ type: "text", text: `[ERROR] Failed to ask human: ${message}` }]
96
+ content: [{ type: "text", text: `[ERROR] ask_human failed: ${message}` }],
28
97
  };
29
98
  }
30
99
  }
@@ -3,7 +3,9 @@ import { execSync } from "child_process";
3
3
  * Checks for active network ports and their status.
4
4
  */
5
5
  export function handleCheckPorts(projectRoot, args) {
6
- const filter = args.filter || ""; // Optional filter (e.g., ":3000")
6
+ const rawFilter = args.filter || "";
7
+ // Sanitize filter to prevent command injection (allow only alphanumeric, dots, colons, dashes, underscores)
8
+ const filter = rawFilter.replace(/[^a-zA-Z0-9.:_-]/g, "");
7
9
  try {
8
10
  // Using 'lsof -i -P -n' to list open files and network connections
9
11
  // Note: may require permissions or behave differently on non-Unix systems