atabey 0.0.13 → 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 (271) hide show
  1. package/ATABEY.md +1 -1
  2. package/README.md +252 -52
  3. package/dist/framework-mcp/src/index.js +914 -62
  4. package/dist/framework-mcp/src/index.js.map +1 -1
  5. package/dist/framework-mcp/src/tools/compliance/mask_pii.d.ts +17 -0
  6. package/dist/framework-mcp/src/tools/compliance/mask_pii.js +56 -0
  7. package/dist/framework-mcp/src/tools/compliance/mask_pii.js.map +1 -0
  8. package/dist/framework-mcp/src/tools/definitions.js +10 -9
  9. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  10. package/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  11. package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
  12. package/dist/framework-mcp/src/tools/index.js +7 -8
  13. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  14. package/dist/framework-mcp/src/tools/messaging/approve_operation.d.ts +22 -0
  15. package/dist/framework-mcp/src/tools/messaging/approve_operation.js +81 -0
  16. package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -0
  17. package/dist/framework-mcp/src/tools/messaging/ask_human.d.ts +15 -0
  18. package/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  19. package/dist/framework-mcp/src/tools/messaging/ask_human.js.map +1 -1
  20. package/dist/framework-mcp/src/tools/observability/check_ports.js +3 -1
  21. package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
  22. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
  23. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -1
  24. package/dist/framework-mcp/src/tools/schemas.d.ts +48 -53
  25. package/dist/framework-mcp/src/tools/schemas.js +18 -22
  26. package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
  27. package/dist/framework-mcp/src/tools/shell/run_command.js +10 -0
  28. package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
  29. package/dist/framework-mcp/src/tools/types.d.ts +11 -105
  30. package/dist/framework-mcp/src/tools/types.js +1 -0
  31. package/dist/framework-mcp/src/tools/types.js.map +1 -1
  32. package/dist/framework-mcp/src/utils/auth.d.ts +36 -0
  33. package/dist/framework-mcp/src/utils/auth.js +79 -0
  34. package/dist/framework-mcp/src/utils/auth.js.map +1 -0
  35. package/dist/framework-mcp/src/utils/auto-rollback.d.ts +71 -0
  36. package/dist/framework-mcp/src/utils/auto-rollback.js +266 -0
  37. package/dist/framework-mcp/src/utils/auto-rollback.js.map +1 -0
  38. package/dist/framework-mcp/src/utils/compliance.js +12 -4
  39. package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
  40. package/dist/framework-mcp/src/utils/context-optimizer.d.ts +69 -0
  41. package/dist/framework-mcp/src/utils/context-optimizer.js +157 -0
  42. package/dist/framework-mcp/src/utils/context-optimizer.js.map +1 -0
  43. package/dist/framework-mcp/src/utils/discipline.d.ts +68 -0
  44. package/dist/framework-mcp/src/utils/discipline.js +218 -0
  45. package/dist/framework-mcp/src/utils/discipline.js.map +1 -0
  46. package/dist/framework-mcp/src/utils/finops.d.ts +143 -0
  47. package/dist/framework-mcp/src/utils/finops.js +326 -0
  48. package/dist/framework-mcp/src/utils/finops.js.map +1 -0
  49. package/dist/framework-mcp/src/utils/human-in-loop.d.ts +95 -0
  50. package/dist/framework-mcp/src/utils/human-in-loop.js +216 -0
  51. package/dist/framework-mcp/src/utils/human-in-loop.js.map +1 -0
  52. package/dist/framework-mcp/src/utils/license-scanner.d.ts +71 -0
  53. package/dist/framework-mcp/src/utils/license-scanner.js +284 -0
  54. package/dist/framework-mcp/src/utils/license-scanner.js.map +1 -0
  55. package/dist/framework-mcp/src/utils/loop-detector.d.ts +105 -0
  56. package/dist/framework-mcp/src/utils/loop-detector.js +362 -0
  57. package/dist/framework-mcp/src/utils/loop-detector.js.map +1 -0
  58. package/dist/framework-mcp/src/utils/quality.d.ts +19 -0
  59. package/dist/framework-mcp/src/utils/quality.js +124 -0
  60. package/dist/framework-mcp/src/utils/quality.js.map +1 -0
  61. package/dist/framework-mcp/src/utils/rules-engine.d.ts +78 -0
  62. package/dist/framework-mcp/src/utils/rules-engine.js +232 -0
  63. package/dist/framework-mcp/src/utils/rules-engine.js.map +1 -0
  64. package/dist/framework-mcp/src/utils/silent-router.d.ts +47 -0
  65. package/dist/framework-mcp/src/utils/silent-router.js +129 -0
  66. package/dist/framework-mcp/src/utils/silent-router.js.map +1 -0
  67. package/dist/framework-mcp/src/utils/storage.d.ts +1 -0
  68. package/dist/framework-mcp/src/utils/storage.js +2 -2
  69. package/dist/framework-mcp/src/utils/storage.js.map +1 -1
  70. package/dist/framework-mcp/src/utils/telemetry-streamer.d.ts +133 -0
  71. package/dist/framework-mcp/src/utils/telemetry-streamer.js +397 -0
  72. package/dist/framework-mcp/src/utils/telemetry-streamer.js.map +1 -0
  73. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +2 -2
  74. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
  75. package/dist/framework-mcp/tests/tools/framework/run_tests.test.d.ts +1 -0
  76. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js +49 -0
  77. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js.map +1 -0
  78. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +14 -5
  79. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
  80. package/dist/framework-mcp/tests/tools/observability/check_ports.test.d.ts +1 -0
  81. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js +30 -0
  82. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js.map +1 -0
  83. package/dist/framework-mcp/tests/tools/shell/run_command.test.js +7 -0
  84. package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -1
  85. package/dist/framework-mcp/tests/utils/auto-rollback.test.d.ts +7 -0
  86. package/dist/framework-mcp/tests/utils/auto-rollback.test.js +178 -0
  87. package/dist/framework-mcp/tests/utils/auto-rollback.test.js.map +1 -0
  88. package/dist/framework-mcp/tests/utils/context-optimizer.test.d.ts +1 -0
  89. package/dist/framework-mcp/tests/utils/context-optimizer.test.js +62 -0
  90. package/dist/framework-mcp/tests/utils/context-optimizer.test.js.map +1 -0
  91. package/dist/framework-mcp/tests/utils/finops.test.d.ts +7 -0
  92. package/dist/framework-mcp/tests/utils/finops.test.js +157 -0
  93. package/dist/framework-mcp/tests/utils/finops.test.js.map +1 -0
  94. package/dist/framework-mcp/tests/utils/human-in-loop.test.d.ts +1 -0
  95. package/dist/framework-mcp/tests/utils/human-in-loop.test.js +59 -0
  96. package/dist/framework-mcp/tests/utils/human-in-loop.test.js.map +1 -0
  97. package/dist/framework-mcp/tests/utils/license-scanner.test.d.ts +7 -0
  98. package/dist/framework-mcp/tests/utils/license-scanner.test.js +131 -0
  99. package/dist/framework-mcp/tests/utils/license-scanner.test.js.map +1 -0
  100. package/dist/framework-mcp/tests/utils/loop-detector.test.d.ts +7 -0
  101. package/dist/framework-mcp/tests/utils/loop-detector.test.js +204 -0
  102. package/dist/framework-mcp/tests/utils/loop-detector.test.js.map +1 -0
  103. package/dist/framework-mcp/tests/utils/rules-engine.test.d.ts +1 -0
  104. package/dist/framework-mcp/tests/utils/rules-engine.test.js +106 -0
  105. package/dist/framework-mcp/tests/utils/rules-engine.test.js.map +1 -0
  106. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.d.ts +7 -0
  107. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js +201 -0
  108. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js.map +1 -0
  109. package/dist/src/cli/commands/check.js +16 -1
  110. package/dist/src/cli/commands/check.js.map +1 -1
  111. package/dist/src/cli/commands/dashboard.js +188 -164
  112. package/dist/src/cli/commands/dashboard.js.map +1 -1
  113. package/dist/src/cli/commands/gateway.js +2 -2
  114. package/dist/src/cli/commands/gateway.js.map +1 -1
  115. package/dist/src/cli/commands/init/scaffold-core.d.ts +2 -0
  116. package/dist/src/cli/commands/init/scaffold-core.js +16 -1
  117. package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
  118. package/dist/src/cli/commands/init/scaffold-ops.js +2 -2
  119. package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -1
  120. package/dist/src/cli/commands/init/scaffold-standards.js +13 -1
  121. package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
  122. package/dist/src/cli/commands/init.d.ts +4 -0
  123. package/dist/src/cli/commands/init.js +80 -24
  124. package/dist/src/cli/commands/init.js.map +1 -1
  125. package/dist/src/cli/commands/quickstart.d.ts +1 -1
  126. package/dist/src/cli/commands/quickstart.js +12 -24
  127. package/dist/src/cli/commands/quickstart.js.map +1 -1
  128. package/dist/src/cli/index.js +24 -23
  129. package/dist/src/cli/index.js.map +1 -1
  130. package/dist/src/cli/shims.js +7 -7
  131. package/dist/src/cli/utils/pkg.js +2 -3
  132. package/dist/src/cli/utils/pkg.js.map +1 -1
  133. package/dist/src/cli/utils/quality.d.ts +10 -0
  134. package/dist/src/cli/utils/quality.js +10 -0
  135. package/dist/src/cli/utils/quality.js.map +1 -0
  136. package/dist/src/modules/agents/definitions.js +45 -40
  137. package/dist/src/modules/agents/definitions.js.map +1 -1
  138. package/dist/src/modules/agents/registry/manager.js +6 -1
  139. package/dist/src/modules/agents/registry/manager.js.map +1 -1
  140. package/dist/src/modules/engines/agent-executor.d.ts +6 -10
  141. package/dist/src/modules/engines/agent-executor.js +53 -21
  142. package/dist/src/modules/engines/agent-executor.js.map +1 -1
  143. package/dist/src/modules/engines/agent-loop.d.ts +34 -0
  144. package/dist/src/modules/engines/agent-loop.js +102 -0
  145. package/dist/src/modules/engines/agent-loop.js.map +1 -0
  146. package/dist/src/modules/engines/evaluation-engine.js +2 -2
  147. package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
  148. package/dist/src/modules/engines/quality-gate.d.ts +13 -5
  149. package/dist/src/modules/engines/quality-gate.js +39 -31
  150. package/dist/src/modules/engines/quality-gate.js.map +1 -1
  151. package/dist/src/modules/engines/routing-engine.d.ts +5 -3
  152. package/dist/src/modules/engines/routing-engine.js +16 -9
  153. package/dist/src/modules/engines/routing-engine.js.map +1 -1
  154. package/dist/src/modules/gateway/cost-tracker.d.ts +5 -0
  155. package/dist/src/modules/gateway/cost-tracker.js +71 -0
  156. package/dist/src/modules/gateway/cost-tracker.js.map +1 -1
  157. package/dist/src/modules/gateway/gateway.d.ts +4 -0
  158. package/dist/src/modules/gateway/gateway.js +8 -0
  159. package/dist/src/modules/gateway/gateway.js.map +1 -1
  160. package/dist/src/shared/audit.js +3 -2
  161. package/dist/src/shared/audit.js.map +1 -1
  162. package/dist/src/shared/pii.d.ts +41 -9
  163. package/dist/src/shared/pii.js +122 -31
  164. package/dist/src/shared/pii.js.map +1 -1
  165. package/dist/src/shared/storage.d.ts +19 -0
  166. package/dist/src/shared/storage.js +46 -6
  167. package/dist/src/shared/storage.js.map +1 -1
  168. package/dist/tests/embedding.test.d.ts +1 -0
  169. package/dist/tests/embedding.test.js +82 -0
  170. package/dist/tests/embedding.test.js.map +1 -0
  171. package/dist/tests/engines/evaluation-engine.test.d.ts +1 -0
  172. package/dist/tests/engines/evaluation-engine.test.js +71 -0
  173. package/dist/tests/engines/evaluation-engine.test.js.map +1 -0
  174. package/dist/tests/engines/planning-engine.test.d.ts +1 -0
  175. package/dist/tests/engines/planning-engine.test.js +100 -0
  176. package/dist/tests/engines/planning-engine.test.js.map +1 -0
  177. package/dist/tests/engines/quality-gate.test.d.ts +1 -0
  178. package/dist/tests/engines/quality-gate.test.js +59 -0
  179. package/dist/tests/engines/quality-gate.test.js.map +1 -0
  180. package/dist/tests/engines/risk-engine.test.d.ts +1 -0
  181. package/dist/tests/engines/risk-engine.test.js +80 -0
  182. package/dist/tests/engines/risk-engine.test.js.map +1 -0
  183. package/dist/tests/engines/routing-engine.test.d.ts +1 -0
  184. package/dist/tests/engines/routing-engine.test.js +78 -0
  185. package/dist/tests/engines/routing-engine.test.js.map +1 -0
  186. package/dist/tests/integration/hermes_locking.test.js +1 -0
  187. package/dist/tests/integration/hermes_locking.test.js.map +1 -1
  188. package/dist/tests/modules/gateway/cost-tracker.test.js +20 -1
  189. package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -1
  190. package/dist/tests/shared/lock.test.d.ts +1 -0
  191. package/dist/tests/shared/lock.test.js +95 -0
  192. package/dist/tests/shared/lock.test.js.map +1 -0
  193. package/dist/tests/shared/pii.test.d.ts +1 -0
  194. package/dist/tests/shared/pii.test.js +183 -0
  195. package/dist/tests/shared/pii.test.js.map +1 -0
  196. package/framework-mcp/README.md +307 -35
  197. package/framework-mcp/dist/dashboard/assets/index-B2mYld0c.js +1221 -0
  198. package/framework-mcp/dist/dashboard/index.html +1 -1
  199. package/framework-mcp/dist/framework-mcp/src/index.js +914 -62
  200. package/framework-mcp/dist/framework-mcp/src/tools/compliance/mask_pii.js +55 -0
  201. package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +10 -9
  202. package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  203. package/framework-mcp/dist/framework-mcp/src/tools/index.js +7 -8
  204. package/framework-mcp/dist/framework-mcp/src/tools/messaging/approve_operation.js +80 -0
  205. package/framework-mcp/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  206. package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +3 -1
  207. package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
  208. package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +18 -22
  209. package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +10 -0
  210. package/framework-mcp/dist/framework-mcp/src/tools/types.js +1 -0
  211. package/framework-mcp/dist/framework-mcp/src/utils/auth.js +78 -0
  212. package/framework-mcp/dist/framework-mcp/src/utils/auto-rollback.js +265 -0
  213. package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +12 -4
  214. package/framework-mcp/dist/framework-mcp/src/utils/context-optimizer.js +156 -0
  215. package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +217 -0
  216. package/framework-mcp/dist/framework-mcp/src/utils/finops.js +325 -0
  217. package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +215 -0
  218. package/framework-mcp/dist/framework-mcp/src/utils/license-scanner.js +283 -0
  219. package/framework-mcp/dist/framework-mcp/src/utils/loop-detector.js +361 -0
  220. package/framework-mcp/dist/framework-mcp/src/utils/quality.js +123 -0
  221. package/framework-mcp/dist/framework-mcp/src/utils/rules-engine.js +231 -0
  222. package/framework-mcp/dist/framework-mcp/src/utils/silent-router.js +128 -0
  223. package/framework-mcp/dist/framework-mcp/src/utils/storage.js +2 -2
  224. package/framework-mcp/dist/framework-mcp/src/utils/telemetry-streamer.js +396 -0
  225. package/framework-mcp/dist/src/cli/platforms/core.js +72 -0
  226. package/framework-mcp/dist/src/cli/platforms/index.js +5 -0
  227. package/framework-mcp/dist/src/cli/platforms/paths.js +101 -0
  228. package/framework-mcp/dist/src/cli/platforms/scaffold.js +72 -0
  229. package/framework-mcp/dist/src/cli/platforms/utils.js +75 -0
  230. package/framework-mcp/dist/src/cli/utils/claude.js +57 -0
  231. package/framework-mcp/dist/src/cli/utils/compliance.js +12 -0
  232. package/framework-mcp/dist/src/cli/utils/fs.js +138 -0
  233. package/framework-mcp/dist/src/cli/utils/pkg.js +282 -0
  234. package/framework-mcp/dist/src/cli/utils/quality.js +9 -0
  235. package/framework-mcp/dist/src/modules/agents/definitions.js +563 -0
  236. package/framework-mcp/dist/src/modules/agents/registry/analyst.js +39 -0
  237. package/framework-mcp/dist/src/modules/agents/registry/architect.js +42 -0
  238. package/framework-mcp/dist/src/modules/agents/registry/backend.js +50 -0
  239. package/framework-mcp/dist/src/modules/agents/registry/database.js +45 -0
  240. package/framework-mcp/dist/src/modules/agents/registry/devops.js +45 -0
  241. package/framework-mcp/dist/src/modules/agents/registry/explorer.js +37 -0
  242. package/framework-mcp/dist/src/modules/agents/registry/frontend.js +52 -0
  243. package/framework-mcp/dist/src/modules/agents/registry/git.js +36 -0
  244. package/framework-mcp/dist/src/modules/agents/registry/manager.js +64 -0
  245. package/framework-mcp/dist/src/modules/agents/registry/mobile.js +41 -0
  246. package/framework-mcp/dist/src/modules/agents/registry/native.js +41 -0
  247. package/framework-mcp/dist/src/modules/agents/registry/quality.js +43 -0
  248. package/framework-mcp/dist/src/modules/agents/registry/security.js +42 -0
  249. package/framework-mcp/dist/src/modules/agents/types.js +1 -0
  250. package/framework-mcp/dist/src/modules/engines/quality-gate.js +92 -0
  251. package/framework-mcp/dist/src/modules/engines/risk-engine.js +105 -0
  252. package/framework-mcp/dist/src/modules/engines/routing-engine.js +408 -0
  253. package/framework-mcp/dist/src/modules/engines/types.js +1 -0
  254. package/framework-mcp/dist/src/modules/providers/definitions.js +140 -0
  255. package/framework-mcp/dist/src/modules/providers/registry.js +18 -0
  256. package/framework-mcp/dist/src/modules/providers/shared.js +104 -0
  257. package/framework-mcp/dist/src/modules/providers/types.js +1 -0
  258. package/framework-mcp/dist/src/modules/skills/adapter-skills.js +449 -0
  259. package/framework-mcp/dist/src/modules/skills/definitions.js +70 -0
  260. package/framework-mcp/dist/src/shared/audit.js +220 -0
  261. package/framework-mcp/dist/src/shared/errors.js +68 -0
  262. package/framework-mcp/dist/src/shared/lock.js +159 -0
  263. package/framework-mcp/dist/src/shared/pii.js +122 -31
  264. package/framework-mcp/dist/src/shared/retention.js +170 -0
  265. package/framework-mcp/dist/src/shared/storage.js +46 -6
  266. package/framework-mcp/dist/src/shared/string.js +29 -0
  267. package/framework-mcp/package.json +8 -2
  268. package/mcp.json +11 -6
  269. package/package.json +13 -6
  270. package/templates/full/ATABEY_FULL.md +1 -1
  271. package/framework-mcp/dist/dashboard/assets/index-BAPGLiWE.js +0 -267
@@ -28,7 +28,8 @@ describe("Hermes Lock Protocol & Message sending", () => {
28
28
  category: "ACTION",
29
29
  content: "Build database models",
30
30
  traceId: asTraceID("T-123"),
31
- priority: "HIGH"
31
+ priority: "HIGH",
32
+ requiresApproval: false,
32
33
  };
33
34
  const result = await handleSendAgentMessage(TEST_DIR, args);
34
35
  expect(result.content[0].text).toContain("[OK] Message sent to @backend");
@@ -54,7 +55,9 @@ describe("Hermes Lock Protocol & Message sending", () => {
54
55
  from: asAgentID("@manager"),
55
56
  category: "ACTION",
56
57
  content: "Build database models",
57
- traceId: asTraceID("T-123")
58
+ traceId: asTraceID("T-123"),
59
+ priority: "NORMAL",
60
+ requiresApproval: false,
58
61
  };
59
62
  const startTime = Date.now();
60
63
  const result = await handleSendAgentMessage(TEST_DIR, args);
@@ -75,7 +78,9 @@ describe("Hermes Lock Protocol & Message sending", () => {
75
78
  from: asAgentID("@manager"),
76
79
  category: "ACTION",
77
80
  content: "Build database models",
78
- traceId: asTraceID("T-123")
81
+ traceId: asTraceID("T-123"),
82
+ priority: "NORMAL",
83
+ requiresApproval: false,
79
84
  };
80
85
  const result = await handleSendAgentMessage(TEST_DIR, args);
81
86
  expect(result.content[0].text).toContain("[OK] Message sent to @backend");
@@ -87,7 +92,9 @@ describe("Hermes Lock Protocol & Message sending", () => {
87
92
  from: asAgentID("@manager"),
88
93
  category: "ACTION",
89
94
  content: "Job 1",
90
- traceId: asTraceID("T-123")
95
+ traceId: asTraceID("T-123"),
96
+ priority: "NORMAL",
97
+ requiresApproval: false,
91
98
  });
92
99
  // Delay starting the second call slightly to make sure lock is acquired by Job 1 first
93
100
  await new Promise((resolve) => setTimeout(resolve, 50));
@@ -96,7 +103,9 @@ describe("Hermes Lock Protocol & Message sending", () => {
96
103
  from: asAgentID("@frontend"),
97
104
  category: "ACTION",
98
105
  content: "Job 2",
99
- traceId: asTraceID("T-123")
106
+ traceId: asTraceID("T-123"),
107
+ priority: "NORMAL",
108
+ requiresApproval: false,
100
109
  });
101
110
  const [res1, res2] = await Promise.all([send1Promise, send2Promise]);
102
111
  expect(res1.isError).toBeFalsy();
@@ -1 +1 @@
1
- {"version":3,"file":"send_message.test.js","sourceRoot":"","sources":["../../../../../framework-mcp/tests/tools/messaging/send_message.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send_message.test.js","sourceRoot":"","sources":["../../../../../framework-mcp/tests/tools/messaging/send_message.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { handleCheckPorts } from "../../../src/tools/observability/check_ports.js";
3
+ import { execSync } from "child_process";
4
+ vi.mock("child_process");
5
+ describe("handleCheckPorts", () => {
6
+ const projectRoot = "/fake/project";
7
+ afterEach(() => {
8
+ vi.clearAllMocks();
9
+ });
10
+ it("should sanitize and run with a normal filter", () => {
11
+ const args = { filter: ":3000" };
12
+ vi.mocked(execSync).mockReturnValue("tcp 0 0 *:3000 LISTEN");
13
+ const result = handleCheckPorts(projectRoot, args);
14
+ expect(execSync).toHaveBeenCalled();
15
+ const calledCommand = vi.mocked(execSync).mock.calls[0][0];
16
+ expect(calledCommand).toContain(":3000");
17
+ expect(result.content[0].text).toContain("tcp 0 0 *:3000 LISTEN");
18
+ });
19
+ it("should strip malicious characters to prevent command injection", () => {
20
+ const args = { filter: "; rm -rf /" };
21
+ vi.mocked(execSync).mockReturnValue("some list");
22
+ handleCheckPorts(projectRoot, args);
23
+ expect(execSync).toHaveBeenCalled();
24
+ const calledCommand = vi.mocked(execSync).mock.calls[0][0];
25
+ // The malicious filter "; rm -rf /" should be sanitized to "rm-rf"
26
+ expect(calledCommand).not.toContain(";");
27
+ expect(calledCommand).toContain("grep rm-rf");
28
+ });
29
+ });
30
+ //# sourceMappingURL=check_ports.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check_ports.test.js","sourceRoot":"","sources":["../../../../../framework-mcp/tests/tools/observability/check_ports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAEzB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,MAAM,WAAW,GAAG,eAAe,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACX,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACjC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,uBAA8B,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEnD,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;QACrE,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACtC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,WAAkB,CAAC,CAAC;QAExD,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;QACrE,mEAAmE;QACnE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -26,6 +26,13 @@ describe("handleRunCommand", () => {
26
26
  expect(result.isError).toBe(true);
27
27
  expect(result.content[0].text).toContain("Command not allowed");
28
28
  });
29
+ it("should reject command injection attempts", async () => {
30
+ const args = { command: "git status && echo injected" };
31
+ const result = await handleRunCommand(projectRoot, args);
32
+ expect(exec).not.toHaveBeenCalled();
33
+ expect(result.isError).toBe(true);
34
+ expect(result.content[0].text).toContain("Command rejected: Shell metacharacters are forbidden");
35
+ });
29
36
  it("should handle command failure", async () => {
30
37
  const args = { command: "npm run build" };
31
38
  vi.mocked(exec).mockImplementation((_cmd, _opts, callback) => {
@@ -1 +1 @@
1
- {"version":3,"file":"run_command.test.js","sourceRoot":"","sources":["../../../../../framework-mcp/tests/tools/shell/run_command.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAEzB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,MAAM,WAAW,GAAG,eAAe,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACX,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAEvC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACzD,iEAAiE;YACjE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO,EAAS,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5G,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAE1C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACzD,iEAAiE;YACjE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;YACpE,OAAO,EAAS,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"run_command.test.js","sourceRoot":"","sources":["../../../../../framework-mcp/tests/tools/shell/run_command.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ─── AUTO-ROLLBACK TEST ───────────────────────────────────────────
3
+ *
4
+ * Tests the auto-rollback and regenerate mechanism.
5
+ * Covers: snapshot capture, rollback, regenerate instructions, content validation.
6
+ */
7
+ export {};
@@ -0,0 +1,178 @@
1
+ /**
2
+ * ─── AUTO-ROLLBACK TEST ───────────────────────────────────────────
3
+ *
4
+ * Tests the auto-rollback and regenerate mechanism.
5
+ * Covers: snapshot capture, rollback, regenerate instructions, content validation.
6
+ */
7
+ import fs from "fs";
8
+ import os from "os";
9
+ import path from "path";
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
11
+ describe("AutoRollback", () => {
12
+ let AutoRollbackEngine;
13
+ let tempDir;
14
+ let testFilePath;
15
+ beforeEach(async () => {
16
+ vi.resetModules();
17
+ // Create temp directory for file operations
18
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "atabey-rollback-test-"));
19
+ testFilePath = path.join(tempDir, "test-file.ts");
20
+ const mod = await import("../../src/utils/auto-rollback.js");
21
+ AutoRollbackEngine = mod.AutoRollbackEngine;
22
+ AutoRollbackEngine.initialize();
23
+ });
24
+ afterEach(() => {
25
+ // Cleanup temp directory
26
+ try {
27
+ fs.rmSync(tempDir, { recursive: true, force: true });
28
+ }
29
+ catch { /* ignore */ }
30
+ });
31
+ describe("Snapshot Capture", () => {
32
+ it("should capture snapshot of existing file", () => {
33
+ fs.writeFileSync(testFilePath, "const x = 1;", "utf8");
34
+ AutoRollbackEngine.prepareWrite(testFilePath, "trace-1");
35
+ const stats = AutoRollbackEngine.getSnapshotStats();
36
+ expect(stats.total).toBeGreaterThanOrEqual(1);
37
+ expect(stats.restored).toBe(0);
38
+ });
39
+ it("should capture snapshot of new file (null original)", () => {
40
+ AutoRollbackEngine.prepareWrite(testFilePath, "trace-1");
41
+ const stats = AutoRollbackEngine.getSnapshotStats();
42
+ expect(stats.total).toBeGreaterThanOrEqual(1);
43
+ });
44
+ });
45
+ describe("validateAndRollback", () => {
46
+ it("should return null for no violations", () => {
47
+ const result = AutoRollbackEngine.validateAndRollback(testFilePath, "const x = 1;", []);
48
+ expect(result).toBeNull();
49
+ });
50
+ it("should restore original file content on violation", () => {
51
+ // Create original file
52
+ fs.writeFileSync(testFilePath, "const original = true;", "utf8");
53
+ // Capture snapshot
54
+ AutoRollbackEngine.prepareWrite(testFilePath, "trace-1");
55
+ // Write violating content
56
+ fs.writeFileSync(testFilePath, "const x: any = 1;", "utf8");
57
+ // Validate and rollback
58
+ const violations = [
59
+ {
60
+ rule: "No `any` Type",
61
+ severity: "CRITICAL",
62
+ filePath: testFilePath,
63
+ line: 1,
64
+ detail: "Line 1: : any",
65
+ regenerateInstruction: "Replace `any` with `unknown`",
66
+ },
67
+ ];
68
+ const result = AutoRollbackEngine.validateAndRollback(testFilePath, "const x: any = 1;", violations);
69
+ expect(result).not.toBeNull();
70
+ expect(result.length).toBe(1);
71
+ // Verify file was restored
72
+ const content = fs.readFileSync(testFilePath, "utf8");
73
+ expect(content).toBe("const original = true;");
74
+ });
75
+ it("should delete new file on violation", () => {
76
+ // Don't create file (simulating new file)
77
+ AutoRollbackEngine.prepareWrite(testFilePath, "trace-1");
78
+ // Write violating content
79
+ fs.writeFileSync(testFilePath, "console.log('test');", "utf8");
80
+ const violations = [
81
+ {
82
+ rule: "No Console Log",
83
+ severity: "CRITICAL",
84
+ filePath: testFilePath,
85
+ line: 1,
86
+ detail: "Line 1: console.log",
87
+ regenerateInstruction: "Use logger instead",
88
+ },
89
+ ];
90
+ AutoRollbackEngine.validateAndRollback(testFilePath, "console.log('test');", violations);
91
+ // Verify file was deleted
92
+ expect(fs.existsSync(testFilePath)).toBe(false);
93
+ });
94
+ });
95
+ describe("buildRegenerateInstruction", () => {
96
+ it("should build instruction for critical violations", () => {
97
+ const violations = [
98
+ {
99
+ rule: "No `any` Type",
100
+ severity: "CRITICAL",
101
+ filePath: "test.ts",
102
+ line: 5,
103
+ detail: "Line 5: : any",
104
+ regenerateInstruction: "Replace `any` with `unknown`",
105
+ },
106
+ ];
107
+ const instruction = AutoRollbackEngine.buildRegenerateInstruction(violations, "write_file");
108
+ expect(instruction).toContain("BLOCKED and ROLLED BACK");
109
+ expect(instruction).toContain("No `any` Type");
110
+ expect(instruction).toContain("Replace `any` with `unknown`");
111
+ expect(instruction).toContain("regenerate");
112
+ });
113
+ it("should include all violations in instruction", () => {
114
+ const violations = [
115
+ {
116
+ rule: "No `any` Type",
117
+ severity: "CRITICAL",
118
+ filePath: "test.ts",
119
+ line: 5,
120
+ detail: "Line 5: : any",
121
+ regenerateInstruction: "Replace `any` with `unknown`",
122
+ },
123
+ {
124
+ rule: "No Console Log",
125
+ severity: "CRITICAL",
126
+ filePath: "test.ts",
127
+ line: 10,
128
+ detail: "Line 10: console.log",
129
+ regenerateInstruction: "Use logger instead",
130
+ },
131
+ ];
132
+ const instruction = AutoRollbackEngine.buildRegenerateInstruction(violations, "write_file");
133
+ expect(instruction).toContain("No `any` Type");
134
+ expect(instruction).toContain("No Console Log");
135
+ expect(instruction).toContain("Address ALL violations");
136
+ });
137
+ });
138
+ describe("checkWriteContent", () => {
139
+ it("should allow clean content", () => {
140
+ const result = AutoRollbackEngine.checkWriteContent(testFilePath, "const x: string = 'hello';", "trace-1");
141
+ expect(result.allowed).toBe(true);
142
+ expect(result.violations.length).toBe(0);
143
+ });
144
+ it("should block content with `any` type", () => {
145
+ const result = AutoRollbackEngine.checkWriteContent(testFilePath, "const x: any = 1;", "trace-1");
146
+ expect(result.allowed).toBe(false);
147
+ expect(result.violations.length).toBeGreaterThan(0);
148
+ expect(result.violations[0].rule).toContain("any");
149
+ });
150
+ it("should block content with console.log", () => {
151
+ const result = AutoRollbackEngine.checkWriteContent(testFilePath, "console.log('test');", "trace-1");
152
+ expect(result.allowed).toBe(false);
153
+ expect(result.violations.length).toBeGreaterThan(0);
154
+ expect(result.violations[0].rule).toContain("Console");
155
+ });
156
+ it("should skip non-source files", () => {
157
+ const jsonPath = path.join(tempDir, "config.json");
158
+ const result = AutoRollbackEngine.checkWriteContent(jsonPath, "{\"key\": \"value\"}", "trace-1");
159
+ expect(result.allowed).toBe(true);
160
+ });
161
+ it("should provide regenerate instruction when blocked", () => {
162
+ const result = AutoRollbackEngine.checkWriteContent(testFilePath, "const x: any = 1;", "trace-1");
163
+ expect(result.instruction).not.toBeNull();
164
+ expect(result.instruction).toContain("regenerate");
165
+ });
166
+ });
167
+ describe("getSnapshotStats", () => {
168
+ it("should return correct stats", () => {
169
+ fs.writeFileSync(testFilePath, "const x = 1;", "utf8");
170
+ AutoRollbackEngine.prepareWrite(testFilePath, "trace-1");
171
+ const stats = AutoRollbackEngine.getSnapshotStats();
172
+ expect(stats.total).toBeGreaterThanOrEqual(1);
173
+ expect(typeof stats.restored).toBe("number");
174
+ expect(typeof stats.pending).toBe("number");
175
+ });
176
+ });
177
+ });
178
+ //# sourceMappingURL=auto-rollback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-rollback.test.js","sourceRoot":"","sources":["../../../../framework-mcp/tests/utils/auto-rollback.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { checkTokenBudget, estimateTokens, getTokenBudgetStats, resetTokenBudgets, truncateFileContent, } from "../../src/utils/context-optimizer.js";
3
+ describe("Context Optimizer", () => {
4
+ beforeEach(() => {
5
+ resetTokenBudgets();
6
+ });
7
+ describe("estimateTokens", () => {
8
+ it("should estimate tokens from text (4 chars per token)", () => {
9
+ expect(estimateTokens("hello world")).toBe(3); // 11 chars / 4 = 2.75 → 3
10
+ });
11
+ it("should return 0 for empty text", () => {
12
+ expect(estimateTokens("")).toBe(0);
13
+ });
14
+ it("should return 0 for null/undefined", () => {
15
+ expect(estimateTokens(null)).toBe(0);
16
+ });
17
+ });
18
+ describe("checkTokenBudget", () => {
19
+ it("should allow responses within token budget", () => {
20
+ const result = checkTokenBudget("test-agent", "read_file", "small response");
21
+ expect(result).toBeNull();
22
+ });
23
+ it("should block responses exceeding MAX_TOKENS_PER_CALL", () => {
24
+ const largeText = "x".repeat(20000); // ~5000 tokens
25
+ const result = checkTokenBudget("test-agent", "read_file", largeText);
26
+ expect(result).toContain("TOKEN BUDGET");
27
+ expect(result).toContain("too large");
28
+ });
29
+ it("should track token usage per agent", () => {
30
+ checkTokenBudget("agent-1", "read_file", "small");
31
+ checkTokenBudget("agent-2", "write_file", "tiny");
32
+ const stats1 = getTokenBudgetStats("agent-1");
33
+ const stats2 = getTokenBudgetStats("agent-2");
34
+ expect(stats1.callCount).toBe(1);
35
+ expect(stats2.callCount).toBe(1);
36
+ });
37
+ });
38
+ describe("truncateFileContent", () => {
39
+ it("should not truncate small content", () => {
40
+ const content = "line1\nline2\nline3";
41
+ const result = truncateFileContent(content, "test.ts", 100);
42
+ expect(result).toBe(content);
43
+ });
44
+ it("should truncate large content with header note", () => {
45
+ const lines = Array.from({ length: 500 }, (_, i) => `line ${i + 1}`);
46
+ const content = lines.join("\n");
47
+ const result = truncateFileContent(content, "large.ts", 10);
48
+ expect(result).toContain("[TRUNCATED]");
49
+ expect(result).toContain("large.ts");
50
+ expect(result).toContain("more lines truncated");
51
+ });
52
+ });
53
+ describe("getTokenBudgetStats", () => {
54
+ it("should return zero stats for unknown agent", () => {
55
+ const stats = getTokenBudgetStats("unknown-agent");
56
+ expect(stats.totalTokens).toBe(0);
57
+ expect(stats.callCount).toBe(0);
58
+ expect(stats.blocked).toBe(false);
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=context-optimizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-optimizer.test.js","sourceRoot":"","sources":["../../../../framework-mcp/tests/utils/context-optimizer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ─── FINOPS TEST ──────────────────────────────────────────────────
3
+ *
4
+ * Tests the budget management and FinOps enforcement.
5
+ * Covers: budget tracking, threshold alerts, blocking, state persistence.
6
+ */
7
+ export {};
@@ -0,0 +1,157 @@
1
+ /**
2
+ * ─── FINOPS TEST ──────────────────────────────────────────────────
3
+ *
4
+ * Tests the budget management and FinOps enforcement.
5
+ * Covers: budget tracking, threshold alerts, blocking, state persistence.
6
+ */
7
+ import fs from "fs";
8
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
9
+ describe("BudgetManager", () => {
10
+ let BudgetManager;
11
+ let budgetManager;
12
+ beforeEach(async () => {
13
+ vi.resetModules();
14
+ // Clean up any persisted state from previous tests
15
+ const testDir = "/tmp/atabey-test-finops";
16
+ if (fs.existsSync(testDir)) {
17
+ fs.rmSync(testDir, { recursive: true, force: true });
18
+ }
19
+ process.env.ATABEY_FRAMEWORK_DIR = testDir;
20
+ process.env.ATABEY_BUDGET_ENABLED = "true";
21
+ process.env.ATABEY_BUDGET_TEAM = "test-team";
22
+ process.env.ATABEY_BUDGET_MONTHLY = "100";
23
+ process.env.ATABEY_BUDGET_AGENT_MAX = "50";
24
+ process.env.ATABEY_COST_PER_1K_TOKENS = "0.003";
25
+ const mod = await import("../../src/utils/finops.js");
26
+ BudgetManager = mod.BudgetManager;
27
+ BudgetManager.resetInstance();
28
+ budgetManager = BudgetManager.getInstance();
29
+ budgetManager.start();
30
+ });
31
+ afterEach(() => {
32
+ budgetManager.stop();
33
+ delete process.env.ATABEY_FRAMEWORK_DIR;
34
+ });
35
+ describe("Budget State", () => {
36
+ it("should initialize with zero spend", () => {
37
+ const state = budgetManager.getState();
38
+ expect(state.team).toBe("test-team");
39
+ expect(state.monthlySpend).toBe(0);
40
+ expect(state.blocked).toBe(false);
41
+ });
42
+ it("should initialize with period dates", () => {
43
+ const state = budgetManager.getState();
44
+ expect(state.periodStart).toBeDefined();
45
+ expect(state.periodEnd).toBeDefined();
46
+ expect(new Date(state.periodEnd) > new Date(state.periodStart)).toBe(true);
47
+ });
48
+ });
49
+ describe("recordUsage", () => {
50
+ it("should record token usage and calculate cost", () => {
51
+ // 1000 tokens = $0.003 (since COST_PER_1K_TOKENS = 0.003)
52
+ budgetManager.recordUsage("agent-1", 1000);
53
+ const state = budgetManager.getState();
54
+ expect(state.monthlySpend).toBe(0.003);
55
+ expect(state.agentSpend["agent-1"]).toBe(0.003);
56
+ });
57
+ it("should return null for within-budget usage", () => {
58
+ const result = budgetManager.recordUsage("agent-1", 100);
59
+ expect(result).toBeNull();
60
+ });
61
+ it("should allow multiple agents to spend", () => {
62
+ budgetManager.recordUsage("agent-1", 1000);
63
+ budgetManager.recordUsage("agent-2", 2000);
64
+ const state = budgetManager.getState();
65
+ expect(state.agentSpend["agent-1"]).toBe(0.003);
66
+ expect(state.agentSpend["agent-2"]).toBe(0.006);
67
+ expect(state.monthlySpend).toBeCloseTo(0.009, 4);
68
+ });
69
+ });
70
+ describe("Budget Limits", () => {
71
+ it("should block when agent exceeds max budget", () => {
72
+ // Agent max budget = $50, so 50/0.003 * 1000 ≈ 16,666,666 tokens
73
+ const error = budgetManager.recordUsage("agent-1", 17000000);
74
+ expect(error).not.toBeNull();
75
+ expect(error).toContain("exceeded max budget");
76
+ });
77
+ it("should block when team exceeds monthly budget", () => {
78
+ // Monthly budget = $100, so we need ~33,333,334 tokens
79
+ const error = budgetManager.recordUsage("agent-1", 34000000);
80
+ expect(error).not.toBeNull();
81
+ expect(error).toContain("exceeded monthly budget");
82
+ });
83
+ it("should stay blocked after budget exceeded", () => {
84
+ budgetManager.recordUsage("agent-1", 34000000);
85
+ const result = budgetManager.recordUsage("agent-1", 1000);
86
+ expect(result).not.toBeNull();
87
+ expect(result).toContain("Budget exceeded");
88
+ });
89
+ });
90
+ describe("checkBudget", () => {
91
+ it("should return allowed=true for within budget", () => {
92
+ budgetManager.recordUsage("agent-1", 1000);
93
+ const result = budgetManager.checkBudget("agent-1");
94
+ expect(result.allowed).toBe(true);
95
+ expect(result.monthlySpend).toBeGreaterThan(0);
96
+ });
97
+ it("should return blocked=true when budget exceeded", () => {
98
+ budgetManager.recordUsage("agent-1", 34000000);
99
+ const result = budgetManager.checkBudget("agent-1");
100
+ expect(result.blocked).toBe(true);
101
+ expect(result.allowed).toBe(false);
102
+ });
103
+ it("should report usage percentage", () => {
104
+ // Use $50 out of $100 (50%)
105
+ budgetManager.recordUsage("agent-1", 16666667);
106
+ const result = budgetManager.checkBudget("agent-1");
107
+ expect(result.usagePercent).toBeGreaterThan(45);
108
+ expect(result.usagePercent).toBeLessThan(55);
109
+ });
110
+ });
111
+ describe("resetPeriod", () => {
112
+ it("should reset all spend data", () => {
113
+ budgetManager.recordUsage("agent-1", 50000);
114
+ budgetManager.resetPeriod();
115
+ const state = budgetManager.getState();
116
+ expect(state.monthlySpend).toBe(0);
117
+ expect(Object.keys(state.agentSpend).length).toBe(0);
118
+ expect(state.blocked).toBe(false);
119
+ });
120
+ it("should update period dates on reset", () => {
121
+ const managerObj = budgetManager;
122
+ managerObj.state.periodStart = new Date(2020, 0, 1).toISOString();
123
+ const oldPeriod = budgetManager.getState().periodStart;
124
+ budgetManager.resetPeriod();
125
+ const newPeriod = budgetManager.getState().periodStart;
126
+ expect(newPeriod).not.toEqual(oldPeriod);
127
+ });
128
+ });
129
+ describe("applyPolicy", () => {
130
+ it("should apply block policy from enterprise", () => {
131
+ budgetManager.applyPolicy({
132
+ team: "test-team",
133
+ monthlyBudget: 100,
134
+ agentMaxBudget: 50,
135
+ blocked: true,
136
+ blockReason: "Enterprise policy override",
137
+ updatedAt: new Date().toISOString(),
138
+ });
139
+ const state = budgetManager.getState();
140
+ expect(state.blocked).toBe(true);
141
+ expect(state.blockReason).toContain("Enterprise policy");
142
+ });
143
+ it("should ignore policy for other teams", () => {
144
+ budgetManager.applyPolicy({
145
+ team: "other-team",
146
+ monthlyBudget: 0,
147
+ agentMaxBudget: 0,
148
+ blocked: true,
149
+ blockReason: "Other team blocked",
150
+ updatedAt: new Date().toISOString(),
151
+ });
152
+ const state = budgetManager.getState();
153
+ expect(state.blocked).toBe(false);
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=finops.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finops.test.js","sourceRoot":"","sources":["../../../../framework-mcp/tests/utils/finops.test.ts"],"names":[],"mappings":"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"}