atabey 0.0.37 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/ATABEY.md +1 -1
  2. package/PRIVACY.md +2 -2
  3. package/README.md +58 -46
  4. package/bin/completion.sh +1 -1
  5. package/dist/atabey/src/cli/commands/api.d.ts +1 -0
  6. package/dist/atabey/src/cli/commands/api.js +90 -0
  7. package/dist/atabey/src/cli/commands/api.js.map +1 -0
  8. package/dist/atabey/src/cli/commands/audit.d.ts +9 -0
  9. package/dist/atabey/src/cli/commands/audit.js +73 -0
  10. package/dist/atabey/src/cli/commands/audit.js.map +1 -0
  11. package/dist/atabey/src/cli/commands/check.js +15 -6
  12. package/dist/atabey/src/cli/commands/check.js.map +1 -1
  13. package/dist/atabey/src/cli/commands/contract.js +51 -8
  14. package/dist/atabey/src/cli/commands/contract.js.map +1 -1
  15. package/dist/atabey/src/cli/commands/coverage.js +17 -12
  16. package/dist/atabey/src/cli/commands/coverage.js.map +1 -1
  17. package/dist/atabey/src/cli/commands/dashboard.js +101 -16
  18. package/dist/atabey/src/cli/commands/dashboard.js.map +1 -1
  19. package/dist/atabey/src/cli/commands/db.d.ts +1 -0
  20. package/dist/atabey/src/cli/commands/db.js +58 -0
  21. package/dist/atabey/src/cli/commands/db.js.map +1 -0
  22. package/dist/atabey/src/cli/commands/hitl.js +2 -1
  23. package/dist/atabey/src/cli/commands/hitl.js.map +1 -1
  24. package/dist/atabey/src/cli/commands/index-codebase.js +10 -0
  25. package/dist/atabey/src/cli/commands/index-codebase.js.map +1 -1
  26. package/dist/atabey/src/cli/commands/init/scaffold-app.js +82 -7
  27. package/dist/atabey/src/cli/commands/init/scaffold-app.js.map +1 -1
  28. package/dist/atabey/src/cli/commands/init/scaffold-core.js +3 -3
  29. package/dist/atabey/src/cli/commands/init/scaffold-core.js.map +1 -1
  30. package/dist/atabey/src/cli/commands/init/scaffold-docs.js +1 -1
  31. package/dist/atabey/src/cli/commands/init/scaffold-docs.js.map +1 -1
  32. package/dist/atabey/src/cli/commands/init/scaffold-ops.js +47 -7
  33. package/dist/atabey/src/cli/commands/init/scaffold-ops.js.map +1 -1
  34. package/dist/atabey/src/cli/commands/init/scaffold-standards.js +8 -15
  35. package/dist/atabey/src/cli/commands/init/scaffold-standards.js.map +1 -1
  36. package/dist/atabey/src/cli/commands/init.js +28 -62
  37. package/dist/atabey/src/cli/commands/init.js.map +1 -1
  38. package/dist/atabey/src/cli/commands/lint.d.ts +2 -1
  39. package/dist/atabey/src/cli/commands/lint.js +20 -1
  40. package/dist/atabey/src/cli/commands/lint.js.map +1 -1
  41. package/dist/atabey/src/cli/commands/mcp.js +71 -33
  42. package/dist/atabey/src/cli/commands/mcp.js.map +1 -1
  43. package/dist/atabey/src/cli/commands/orchestrate.d.ts +4 -4
  44. package/dist/atabey/src/cli/commands/orchestrate.js +1 -1
  45. package/dist/atabey/src/cli/commands/orchestrate.js.map +1 -1
  46. package/dist/atabey/src/cli/commands/plan.d.ts +1 -1
  47. package/dist/atabey/src/cli/commands/plan.js +10 -0
  48. package/dist/atabey/src/cli/commands/plan.js.map +1 -1
  49. package/dist/atabey/src/cli/commands/quickstart.js +1 -1
  50. package/dist/atabey/src/cli/commands/quickstart.js.map +1 -1
  51. package/dist/atabey/src/cli/commands/script.js +4 -0
  52. package/dist/atabey/src/cli/commands/script.js.map +1 -1
  53. package/dist/atabey/src/cli/commands/secrets.d.ts +1 -0
  54. package/dist/atabey/src/cli/commands/secrets.js +146 -0
  55. package/dist/atabey/src/cli/commands/secrets.js.map +1 -0
  56. package/dist/atabey/src/cli/commands/worktree.d.ts +10 -0
  57. package/dist/atabey/src/cli/commands/worktree.js +90 -0
  58. package/dist/atabey/src/cli/commands/worktree.js.map +1 -0
  59. package/dist/atabey/src/cli/index.js +75 -16
  60. package/dist/atabey/src/cli/index.js.map +1 -1
  61. package/dist/atabey/src/cli/platforms/core.d.ts +0 -1
  62. package/dist/atabey/src/cli/platforms/core.js +0 -14
  63. package/dist/atabey/src/cli/platforms/core.js.map +1 -1
  64. package/dist/atabey/src/cli/platforms/index.d.ts +2 -2
  65. package/dist/atabey/src/cli/platforms/index.js +1 -1
  66. package/dist/atabey/src/cli/platforms/index.js.map +1 -1
  67. package/dist/atabey/src/cli/platforms/paths.d.ts +0 -2
  68. package/dist/atabey/src/cli/platforms/paths.js +1 -8
  69. package/dist/atabey/src/cli/platforms/paths.js.map +1 -1
  70. package/dist/atabey/src/cli/platforms/scaffold.js +1 -1
  71. package/dist/atabey/src/cli/platforms/scaffold.js.map +1 -1
  72. package/dist/atabey/src/cli/utils/claude.js +6 -0
  73. package/dist/atabey/src/cli/utils/claude.js.map +1 -1
  74. package/dist/atabey/src/cli/utils/compliance.d.ts +1 -1
  75. package/dist/atabey/src/cli/utils/compliance.js +33 -20
  76. package/dist/atabey/src/cli/utils/compliance.js.map +1 -1
  77. package/dist/atabey/src/cli/utils/fs.js +1 -1
  78. package/dist/atabey/src/cli/utils/fs.js.map +1 -1
  79. package/dist/atabey/src/cli/utils/i18n.js +2 -2
  80. package/dist/atabey/src/cli/utils/i18n.js.map +1 -1
  81. package/dist/atabey/src/cli/utils/memory.js +27 -16
  82. package/dist/atabey/src/cli/utils/memory.js.map +1 -1
  83. package/dist/atabey/src/cli/utils/pkg.js +5 -2
  84. package/dist/atabey/src/cli/utils/pkg.js.map +1 -1
  85. package/dist/atabey/src/cli/utils/quality.d.ts +1 -1
  86. package/dist/atabey/src/cli/utils/ui.d.ts +1 -1
  87. package/dist/atabey/src/cli/utils/ui.js +1 -1
  88. package/dist/atabey/src/modules/agents/definitions.d.ts +1 -1
  89. package/dist/atabey/src/modules/agents/definitions.js +13 -9
  90. package/dist/atabey/src/modules/agents/definitions.js.map +1 -1
  91. package/dist/atabey/src/modules/agents/registry/analyst.js +0 -2
  92. package/dist/atabey/src/modules/agents/registry/analyst.js.map +1 -1
  93. package/dist/atabey/src/modules/agents/registry/architect.js +0 -2
  94. package/dist/atabey/src/modules/agents/registry/architect.js.map +1 -1
  95. package/dist/atabey/src/modules/agents/registry/backend.js +0 -2
  96. package/dist/atabey/src/modules/agents/registry/backend.js.map +1 -1
  97. package/dist/atabey/src/modules/agents/registry/database.js +0 -2
  98. package/dist/atabey/src/modules/agents/registry/database.js.map +1 -1
  99. package/dist/atabey/src/modules/agents/registry/devops.js +0 -2
  100. package/dist/atabey/src/modules/agents/registry/devops.js.map +1 -1
  101. package/dist/atabey/src/modules/agents/registry/explorer.js +0 -2
  102. package/dist/atabey/src/modules/agents/registry/explorer.js.map +1 -1
  103. package/dist/atabey/src/modules/agents/registry/frontend.js +0 -2
  104. package/dist/atabey/src/modules/agents/registry/frontend.js.map +1 -1
  105. package/dist/atabey/src/modules/agents/registry/git.js +0 -2
  106. package/dist/atabey/src/modules/agents/registry/git.js.map +1 -1
  107. package/dist/atabey/src/modules/agents/registry/manager.js +0 -3
  108. package/dist/atabey/src/modules/agents/registry/manager.js.map +1 -1
  109. package/dist/atabey/src/modules/agents/registry/mobile.js +0 -2
  110. package/dist/atabey/src/modules/agents/registry/mobile.js.map +1 -1
  111. package/dist/atabey/src/modules/agents/registry/native.js +0 -2
  112. package/dist/atabey/src/modules/agents/registry/native.js.map +1 -1
  113. package/dist/atabey/src/modules/agents/registry/quality.js +3 -5
  114. package/dist/atabey/src/modules/agents/registry/quality.js.map +1 -1
  115. package/dist/atabey/src/modules/agents/registry/security.js +0 -2
  116. package/dist/atabey/src/modules/agents/registry/security.js.map +1 -1
  117. package/dist/atabey/src/modules/agents/types.d.ts +0 -1
  118. package/dist/atabey/src/modules/audit/export.d.ts +22 -0
  119. package/dist/atabey/src/modules/audit/export.js +58 -0
  120. package/dist/atabey/src/modules/audit/export.js.map +1 -0
  121. package/dist/atabey/src/modules/contracts/api.d.ts +2 -2
  122. package/dist/atabey/src/modules/engines/agent-executor.js +37 -0
  123. package/dist/atabey/src/modules/engines/agent-executor.js.map +1 -1
  124. package/dist/atabey/src/modules/engines/evaluation-engine.js +10 -0
  125. package/dist/atabey/src/modules/engines/evaluation-engine.js.map +1 -1
  126. package/dist/atabey/src/modules/engines/quality-gate.js +2 -2
  127. package/dist/atabey/src/modules/engines/quality-gate.js.map +1 -1
  128. package/dist/atabey/src/modules/engines/routing-engine.js +1 -1
  129. package/dist/atabey/src/modules/engines/routing-engine.js.map +1 -1
  130. package/dist/atabey/src/modules/memory/code-graph.d.ts +44 -0
  131. package/dist/atabey/src/modules/memory/code-graph.js +180 -0
  132. package/dist/atabey/src/modules/memory/code-graph.js.map +1 -0
  133. package/dist/atabey/src/modules/memory/context-assembler.d.ts +50 -0
  134. package/dist/atabey/src/modules/memory/context-assembler.js +146 -0
  135. package/dist/atabey/src/modules/memory/context-assembler.js.map +1 -0
  136. package/dist/atabey/src/modules/providers/definitions.js +78 -41
  137. package/dist/atabey/src/modules/providers/definitions.js.map +1 -1
  138. package/dist/atabey/src/modules/providers/shared.d.ts +1 -1
  139. package/dist/atabey/src/modules/providers/shared.js +34 -15
  140. package/dist/atabey/src/modules/providers/shared.js.map +1 -1
  141. package/dist/atabey/src/modules/providers/types.d.ts +0 -4
  142. package/dist/atabey/src/modules/runtime/adapters/headless-cli.d.ts +35 -0
  143. package/dist/atabey/src/modules/runtime/adapters/headless-cli.js +115 -0
  144. package/dist/atabey/src/modules/runtime/adapters/headless-cli.js.map +1 -0
  145. package/dist/atabey/src/modules/runtime/adapters/index.d.ts +2 -0
  146. package/dist/atabey/src/modules/runtime/adapters/index.js +3 -0
  147. package/dist/atabey/src/modules/runtime/adapters/index.js.map +1 -0
  148. package/dist/atabey/src/modules/runtime/adapters/types.d.ts +48 -0
  149. package/dist/atabey/src/modules/runtime/adapters/types.js +12 -0
  150. package/dist/atabey/src/modules/runtime/adapters/types.js.map +1 -0
  151. package/dist/atabey/src/modules/runtime/agent-runtime.d.ts +54 -0
  152. package/dist/atabey/src/modules/runtime/agent-runtime.js +203 -0
  153. package/dist/atabey/src/modules/runtime/agent-runtime.js.map +1 -0
  154. package/dist/atabey/src/modules/runtime/dispatcher.d.ts +75 -0
  155. package/dist/atabey/src/modules/runtime/dispatcher.js +255 -0
  156. package/dist/atabey/src/modules/runtime/dispatcher.js.map +1 -0
  157. package/dist/atabey/src/modules/runtime/evidence.d.ts +39 -0
  158. package/dist/atabey/src/modules/runtime/evidence.js +53 -0
  159. package/dist/atabey/src/modules/runtime/evidence.js.map +1 -0
  160. package/dist/atabey/src/modules/runtime/worktree.d.ts +44 -0
  161. package/dist/atabey/src/modules/runtime/worktree.js +259 -0
  162. package/dist/atabey/src/modules/runtime/worktree.js.map +1 -0
  163. package/dist/atabey/src/modules/skills/adapter-skills.d.ts +0 -29
  164. package/dist/atabey/src/modules/skills/adapter-skills.js +0 -61
  165. package/dist/atabey/src/modules/skills/adapter-skills.js.map +1 -1
  166. package/dist/atabey/src/modules/skills/definitions.d.ts +1 -1
  167. package/dist/atabey/src/modules/skills/definitions.js +8 -8
  168. package/dist/atabey/src/schema/agent-lifecycle.d.ts +36 -0
  169. package/dist/atabey/src/schema/agent-lifecycle.js +96 -0
  170. package/dist/atabey/src/schema/agent-lifecycle.js.map +1 -0
  171. package/dist/atabey-mcp/src/mcp/utils/ast-scan.d.ts +21 -0
  172. package/dist/atabey-mcp/src/mcp/utils/ast-scan.js +64 -0
  173. package/dist/atabey-mcp/src/mcp/utils/ast-scan.js.map +1 -0
  174. package/dist/atabey-mcp/src/mcp/utils/auth.d.ts +73 -0
  175. package/dist/atabey-mcp/src/mcp/utils/auth.js +316 -0
  176. package/dist/atabey-mcp/src/mcp/utils/auth.js.map +1 -0
  177. package/dist/atabey-mcp/src/mcp/utils/auto-rollback.d.ts +83 -0
  178. package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js +418 -0
  179. package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js.map +1 -0
  180. package/dist/atabey-mcp/src/mcp/utils/context-optimizer.d.ts +85 -0
  181. package/dist/atabey-mcp/src/mcp/utils/context-optimizer.js +296 -0
  182. package/dist/atabey-mcp/src/mcp/utils/context-optimizer.js.map +1 -0
  183. package/dist/atabey-mcp/src/mcp/utils/discipline.d.ts +72 -0
  184. package/dist/atabey-mcp/src/mcp/utils/discipline.js +385 -0
  185. package/dist/atabey-mcp/src/mcp/utils/discipline.js.map +1 -0
  186. package/dist/atabey-mcp/src/mcp/utils/finops.d.ts +81 -0
  187. package/dist/atabey-mcp/src/mcp/utils/finops.js +274 -0
  188. package/dist/atabey-mcp/src/mcp/utils/finops.js.map +1 -0
  189. package/dist/atabey-mcp/src/mcp/utils/loop-detector.d.ts +106 -0
  190. package/dist/atabey-mcp/src/mcp/utils/loop-detector.js +419 -0
  191. package/dist/atabey-mcp/src/mcp/utils/loop-detector.js.map +1 -0
  192. package/dist/atabey-mcp/src/mcp/utils/rules-engine.d.ts +80 -0
  193. package/dist/atabey-mcp/src/mcp/utils/rules-engine.js +296 -0
  194. package/dist/atabey-mcp/src/mcp/utils/rules-engine.js.map +1 -0
  195. package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.d.ts +133 -0
  196. package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.js +400 -0
  197. package/dist/atabey-mcp/src/mcp/utils/telemetry-streamer.js.map +1 -0
  198. package/dist/atabey-mcp/src/shared/logger.d.ts +1 -0
  199. package/dist/atabey-mcp/src/shared/logger.js +2 -0
  200. package/dist/atabey-mcp/src/shared/logger.js.map +1 -0
  201. package/dist/atabey-mcp/src/shared/pii.d.ts +1 -0
  202. package/dist/atabey-mcp/src/shared/pii.js +2 -0
  203. package/dist/atabey-mcp/src/shared/pii.js.map +1 -0
  204. package/dist/atabey-mcp/src/shared/storage.d.ts +2 -0
  205. package/dist/atabey-mcp/src/shared/storage.js +3 -0
  206. package/dist/atabey-mcp/src/shared/storage.js.map +1 -0
  207. package/dist/shared/src/agent-identity.d.ts +1 -0
  208. package/dist/shared/src/agent-identity.js +2 -0
  209. package/dist/shared/src/agent-identity.js.map +1 -0
  210. package/dist/shared/src/api-catalog.d.ts +1 -0
  211. package/dist/shared/src/api-catalog.js +2 -0
  212. package/dist/shared/src/api-catalog.js.map +1 -0
  213. package/dist/shared/src/audit-chain.d.ts +1 -51
  214. package/dist/shared/src/audit-chain.js +1 -84
  215. package/dist/shared/src/audit-chain.js.map +1 -1
  216. package/dist/shared/src/audit.d.ts +1 -113
  217. package/dist/shared/src/audit.js +1 -284
  218. package/dist/shared/src/audit.js.map +1 -1
  219. package/dist/shared/src/constants.d.ts +1 -152
  220. package/dist/shared/src/constants.js +1 -215
  221. package/dist/shared/src/constants.js.map +1 -1
  222. package/dist/shared/src/database.d.ts +1 -5
  223. package/dist/shared/src/database.js +1 -12
  224. package/dist/shared/src/database.js.map +1 -1
  225. package/dist/shared/src/errors.d.ts +1 -46
  226. package/dist/shared/src/errors.js +1 -68
  227. package/dist/shared/src/errors.js.map +1 -1
  228. package/dist/shared/src/file-lock.d.ts +1 -88
  229. package/dist/shared/src/file-lock.js +1 -250
  230. package/dist/shared/src/file-lock.js.map +1 -1
  231. package/dist/shared/src/fs.d.ts +1 -9
  232. package/dist/shared/src/fs.js +1 -53
  233. package/dist/shared/src/fs.js.map +1 -1
  234. package/dist/shared/src/index.d.ts +2 -22
  235. package/dist/shared/src/index.js +2 -22
  236. package/dist/shared/src/index.js.map +1 -1
  237. package/dist/shared/src/job-queue.d.ts +1 -53
  238. package/dist/shared/src/job-queue.js +1 -126
  239. package/dist/shared/src/job-queue.js.map +1 -1
  240. package/dist/shared/src/lock.d.ts +1 -82
  241. package/dist/shared/src/lock.js +1 -158
  242. package/dist/shared/src/lock.js.map +1 -1
  243. package/dist/shared/src/logger.d.ts +1 -30
  244. package/dist/shared/src/logger.js +1 -126
  245. package/dist/shared/src/logger.js.map +1 -1
  246. package/dist/shared/src/memory-prune.d.ts +1 -0
  247. package/dist/shared/src/memory-prune.js +2 -0
  248. package/dist/shared/src/memory-prune.js.map +1 -0
  249. package/dist/shared/src/migrations.d.ts +1 -0
  250. package/dist/shared/src/migrations.js +2 -0
  251. package/dist/shared/src/migrations.js.map +1 -0
  252. package/dist/shared/src/modules/agent/agent-identity.d.ts +34 -0
  253. package/dist/shared/src/modules/agent/agent-identity.js +77 -0
  254. package/dist/shared/src/modules/agent/agent-identity.js.map +1 -0
  255. package/dist/shared/src/modules/agent/api-catalog.d.ts +57 -0
  256. package/dist/shared/src/modules/agent/api-catalog.js +254 -0
  257. package/dist/shared/src/modules/agent/api-catalog.js.map +1 -0
  258. package/dist/shared/src/modules/agent/index.d.ts +3 -0
  259. package/dist/shared/src/modules/agent/index.js +4 -0
  260. package/dist/shared/src/modules/agent/index.js.map +1 -0
  261. package/dist/shared/src/modules/agent/tokenizer.d.ts +54 -0
  262. package/dist/shared/src/modules/agent/tokenizer.js +272 -0
  263. package/dist/shared/src/modules/agent/tokenizer.js.map +1 -0
  264. package/dist/shared/src/modules/concurrency/file-lock.d.ts +93 -0
  265. package/dist/shared/src/modules/concurrency/file-lock.js +240 -0
  266. package/dist/shared/src/modules/concurrency/file-lock.js.map +1 -0
  267. package/dist/shared/src/modules/concurrency/index.d.ts +6 -0
  268. package/dist/shared/src/modules/concurrency/index.js +7 -0
  269. package/dist/shared/src/modules/concurrency/index.js.map +1 -0
  270. package/dist/shared/src/modules/concurrency/job-queue.d.ts +76 -0
  271. package/dist/shared/src/modules/concurrency/job-queue.js +200 -0
  272. package/dist/shared/src/modules/concurrency/job-queue.js.map +1 -0
  273. package/dist/shared/src/modules/concurrency/lock.d.ts +82 -0
  274. package/dist/shared/src/modules/concurrency/lock.js +159 -0
  275. package/dist/shared/src/modules/concurrency/lock.js.map +1 -0
  276. package/dist/shared/src/modules/concurrency/resilience.d.ts +84 -0
  277. package/dist/shared/src/modules/concurrency/resilience.js +217 -0
  278. package/dist/shared/src/modules/concurrency/resilience.js.map +1 -0
  279. package/dist/shared/src/modules/concurrency/worker-pool.d.ts +52 -0
  280. package/dist/shared/src/modules/concurrency/worker-pool.js +229 -0
  281. package/dist/shared/src/modules/concurrency/worker-pool.js.map +1 -0
  282. package/dist/shared/src/modules/concurrency/worker-thread.d.ts +21 -0
  283. package/dist/shared/src/modules/concurrency/worker-thread.js +67 -0
  284. package/dist/shared/src/modules/concurrency/worker-thread.js.map +1 -0
  285. package/dist/shared/src/modules/index.d.ts +14 -0
  286. package/dist/shared/src/modules/index.js +15 -0
  287. package/dist/shared/src/modules/index.js.map +1 -0
  288. package/dist/shared/src/modules/observability/audit-chain.d.ts +80 -0
  289. package/dist/shared/src/modules/observability/audit-chain.js +262 -0
  290. package/dist/shared/src/modules/observability/audit-chain.js.map +1 -0
  291. package/dist/shared/src/modules/observability/audit.d.ts +121 -0
  292. package/dist/shared/src/modules/observability/audit.js +322 -0
  293. package/dist/shared/src/modules/observability/audit.js.map +1 -0
  294. package/dist/shared/src/modules/observability/index.d.ts +4 -0
  295. package/dist/shared/src/modules/observability/index.js +5 -0
  296. package/dist/shared/src/modules/observability/index.js.map +1 -0
  297. package/dist/shared/src/modules/observability/logger.d.ts +31 -0
  298. package/dist/shared/src/modules/observability/logger.js +153 -0
  299. package/dist/shared/src/modules/observability/logger.js.map +1 -0
  300. package/dist/shared/src/modules/observability/otel.d.ts +39 -0
  301. package/dist/shared/src/modules/observability/otel.js +93 -0
  302. package/dist/shared/src/modules/observability/otel.js.map +1 -0
  303. package/dist/shared/src/modules/primitives/constants.d.ts +150 -0
  304. package/dist/shared/src/modules/primitives/constants.js +212 -0
  305. package/dist/shared/src/modules/primitives/constants.js.map +1 -0
  306. package/dist/shared/src/modules/primitives/errors.d.ts +46 -0
  307. package/dist/shared/src/modules/primitives/errors.js +69 -0
  308. package/dist/shared/src/modules/primitives/errors.js.map +1 -0
  309. package/dist/shared/src/modules/primitives/fs.d.ts +9 -0
  310. package/dist/shared/src/modules/primitives/fs.js +54 -0
  311. package/dist/shared/src/modules/primitives/fs.js.map +1 -0
  312. package/dist/shared/src/modules/primitives/index.d.ts +7 -0
  313. package/dist/shared/src/modules/primitives/index.js +8 -0
  314. package/dist/shared/src/modules/primitives/index.js.map +1 -0
  315. package/dist/shared/src/modules/primitives/outbound-http.d.ts +32 -0
  316. package/dist/shared/src/modules/primitives/outbound-http.js +88 -0
  317. package/dist/shared/src/modules/primitives/outbound-http.js.map +1 -0
  318. package/dist/shared/src/modules/primitives/string.d.ts +1 -0
  319. package/dist/shared/src/modules/primitives/string.js +30 -0
  320. package/dist/shared/src/modules/primitives/string.js.map +1 -0
  321. package/dist/shared/src/modules/primitives/time.d.ts +5 -0
  322. package/dist/shared/src/modules/primitives/time.js +35 -0
  323. package/dist/shared/src/modules/primitives/time.js.map +1 -0
  324. package/dist/shared/src/modules/primitives/types.d.ts +27 -0
  325. package/dist/shared/src/modules/primitives/types.js +17 -0
  326. package/dist/shared/src/modules/primitives/types.js.map +1 -0
  327. package/dist/shared/src/modules/sandbox/index.d.ts +3 -0
  328. package/dist/shared/src/modules/sandbox/index.js +4 -0
  329. package/dist/shared/src/modules/sandbox/index.js.map +1 -0
  330. package/dist/shared/src/modules/sandbox/sandbox-fs.d.ts +28 -0
  331. package/dist/shared/src/modules/sandbox/sandbox-fs.js +143 -0
  332. package/dist/shared/src/modules/sandbox/sandbox-fs.js.map +1 -0
  333. package/dist/shared/src/modules/sandbox/sandbox-runtime.d.ts +78 -0
  334. package/dist/shared/src/modules/sandbox/sandbox-runtime.js +282 -0
  335. package/dist/shared/src/modules/sandbox/sandbox-runtime.js.map +1 -0
  336. package/dist/shared/src/modules/sandbox/sandbox.d.ts +54 -0
  337. package/dist/shared/src/modules/sandbox/sandbox.js +179 -0
  338. package/dist/shared/src/modules/sandbox/sandbox.js.map +1 -0
  339. package/dist/shared/src/modules/security/index.d.ts +5 -0
  340. package/dist/shared/src/modules/security/index.js +6 -0
  341. package/dist/shared/src/modules/security/index.js.map +1 -0
  342. package/dist/shared/src/modules/security/pii.d.ts +70 -0
  343. package/dist/shared/src/modules/security/pii.js +276 -0
  344. package/dist/shared/src/modules/security/pii.js.map +1 -0
  345. package/dist/shared/src/modules/security/policy-gate.d.ts +42 -0
  346. package/dist/shared/src/modules/security/policy-gate.js +172 -0
  347. package/dist/shared/src/modules/security/policy-gate.js.map +1 -0
  348. package/dist/shared/src/modules/security/retention.d.ts +68 -0
  349. package/dist/shared/src/modules/security/retention.js +218 -0
  350. package/dist/shared/src/modules/security/retention.js.map +1 -0
  351. package/dist/shared/src/modules/security/secrets.d.ts +99 -0
  352. package/dist/shared/src/modules/security/secrets.js +371 -0
  353. package/dist/shared/src/modules/security/secrets.js.map +1 -0
  354. package/dist/shared/src/modules/security/tls.d.ts +87 -0
  355. package/dist/shared/src/modules/security/tls.js +154 -0
  356. package/dist/shared/src/modules/security/tls.js.map +1 -0
  357. package/dist/shared/src/modules/storage/database.d.ts +6 -0
  358. package/dist/shared/src/modules/storage/database.js +16 -0
  359. package/dist/shared/src/modules/storage/database.js.map +1 -0
  360. package/dist/shared/src/modules/storage/index.d.ts +4 -0
  361. package/dist/shared/src/modules/storage/index.js +5 -0
  362. package/dist/shared/src/modules/storage/index.js.map +1 -0
  363. package/dist/shared/src/modules/storage/memory-prune.d.ts +18 -0
  364. package/dist/shared/src/modules/storage/memory-prune.js +48 -0
  365. package/dist/shared/src/modules/storage/memory-prune.js.map +1 -0
  366. package/dist/shared/src/modules/storage/migrations.d.ts +69 -0
  367. package/dist/shared/src/modules/storage/migrations.js +394 -0
  368. package/dist/shared/src/modules/storage/migrations.js.map +1 -0
  369. package/dist/shared/src/modules/storage/storage.d.ts +341 -0
  370. package/dist/shared/src/modules/storage/storage.js +1004 -0
  371. package/dist/shared/src/modules/storage/storage.js.map +1 -0
  372. package/dist/shared/src/otel.d.ts +1 -0
  373. package/dist/shared/src/otel.js +2 -0
  374. package/dist/shared/src/otel.js.map +1 -0
  375. package/dist/shared/src/outbound-http.d.ts +1 -0
  376. package/dist/shared/src/outbound-http.js +2 -0
  377. package/dist/shared/src/outbound-http.js.map +1 -0
  378. package/dist/shared/src/pii.d.ts +1 -69
  379. package/dist/shared/src/pii.js +1 -219
  380. package/dist/shared/src/pii.js.map +1 -1
  381. package/dist/shared/src/policy-gate.d.ts +1 -42
  382. package/dist/shared/src/policy-gate.js +1 -147
  383. package/dist/shared/src/policy-gate.js.map +1 -1
  384. package/dist/shared/src/resilience.d.ts +1 -84
  385. package/dist/shared/src/resilience.js +1 -216
  386. package/dist/shared/src/resilience.js.map +1 -1
  387. package/dist/shared/src/retention.d.ts +1 -63
  388. package/dist/shared/src/retention.js +1 -170
  389. package/dist/shared/src/retention.js.map +1 -1
  390. package/dist/shared/src/sandbox-fs.d.ts +1 -28
  391. package/dist/shared/src/sandbox-fs.js +1 -149
  392. package/dist/shared/src/sandbox-fs.js.map +1 -1
  393. package/dist/shared/src/sandbox-runtime.d.ts +1 -85
  394. package/dist/shared/src/sandbox-runtime.js +1 -249
  395. package/dist/shared/src/sandbox-runtime.js.map +1 -1
  396. package/dist/shared/src/sandbox.d.ts +1 -54
  397. package/dist/shared/src/sandbox.js +1 -178
  398. package/dist/shared/src/sandbox.js.map +1 -1
  399. package/dist/shared/src/secrets.d.ts +1 -0
  400. package/dist/shared/src/secrets.js +2 -0
  401. package/dist/shared/src/secrets.js.map +1 -0
  402. package/dist/shared/src/storage.d.ts +1 -274
  403. package/dist/shared/src/storage.js +1 -723
  404. package/dist/shared/src/storage.js.map +1 -1
  405. package/dist/shared/src/string.d.ts +1 -1
  406. package/dist/shared/src/string.js +1 -29
  407. package/dist/shared/src/string.js.map +1 -1
  408. package/dist/shared/src/time.d.ts +1 -5
  409. package/dist/shared/src/time.js +1 -30
  410. package/dist/shared/src/time.js.map +1 -1
  411. package/dist/shared/src/tls.d.ts +1 -0
  412. package/dist/shared/src/tls.js +2 -0
  413. package/dist/shared/src/tls.js.map +1 -0
  414. package/dist/shared/src/tokenizer.d.ts +1 -0
  415. package/dist/shared/src/tokenizer.js +2 -0
  416. package/dist/shared/src/tokenizer.js.map +1 -0
  417. package/dist/shared/src/types.d.ts +1 -27
  418. package/dist/shared/src/types.js +1 -16
  419. package/dist/shared/src/types.js.map +1 -1
  420. package/dist/shared/src/worker-pool.d.ts +1 -52
  421. package/dist/shared/src/worker-pool.js +1 -209
  422. package/dist/shared/src/worker-pool.js.map +1 -1
  423. package/dist/shared/src/worker-thread.d.ts +1 -21
  424. package/dist/shared/src/worker-thread.js +1 -66
  425. package/dist/shared/src/worker-thread.js.map +1 -1
  426. package/package.json +4 -6
  427. package/templates/docs/tech-stack.md +21 -0
  428. package/templates/full/ATABEY_FULL.md +38 -50
  429. package/templates/prompts/security-audit-recipe.md +1 -1
  430. package/templates/standards/architecture-standards.md +6 -4
  431. package/templates/standards/crud-governance.md +1 -1
  432. package/templates/standards/deployment-standards.md +1 -1
  433. package/templates/standards/enterprise-systems-standards.md +5 -1
  434. package/templates/standards/eslint-standards.md +10 -0
  435. package/templates/standards/frontend-standards.md +2 -2
  436. package/templates/standards/governance-standards.md +2 -2
  437. package/templates/standards/i18n-standards.md +1 -1
  438. package/templates/standards/logging-and-secrets.md +1 -1
  439. package/templates/standards/native-standards.md +1 -1
  440. package/templates/standards/quality-standards.md +1 -1
  441. package/templates/standards/security-audit-standards.md +1 -1
  442. package/templates/standards/security-standards.md +1 -1
  443. package/templates/standards/testing-standards.md +1 -1
  444. package/templates/standards/token-economy.md +27 -0
  445. package/dist/atabey/src/cli/commands/init/create-agent.d.ts +0 -4
  446. package/dist/atabey/src/cli/commands/init/create-agent.js +0 -59
  447. package/dist/atabey/src/cli/commands/init/create-agent.js.map +0 -1
  448. package/dist/atabey/src/cli/utils/config-schema.d.ts +0 -213
  449. package/dist/atabey/src/cli/utils/config-schema.js +0 -58
  450. package/dist/atabey/src/cli/utils/config-schema.js.map +0 -1
  451. package/dist/atabey/src/cli/utils/schemas.d.ts +0 -49
  452. package/dist/atabey/src/cli/utils/schemas.js +0 -20
  453. package/dist/atabey/src/cli/utils/schemas.js.map +0 -1
  454. package/dist/atabey/src/contracts/index.d.ts +0 -1
  455. package/dist/atabey/src/contracts/index.js +0 -2
  456. package/dist/atabey/src/contracts/index.js.map +0 -1
  457. package/dist/atabey/src/contracts/tasks.d.ts +0 -44
  458. package/dist/atabey/src/contracts/tasks.js +0 -21
  459. package/dist/atabey/src/contracts/tasks.js.map +0 -1
  460. package/dist/atabey/src/modules/contracts/index.d.ts +0 -5
  461. package/dist/atabey/src/modules/contracts/index.js +0 -6
  462. package/dist/atabey/src/modules/contracts/index.js.map +0 -1
  463. package/dist/atabey/src/modules/engines/contract-engine.d.ts +0 -46
  464. package/dist/atabey/src/modules/engines/contract-engine.js +0 -116
  465. package/dist/atabey/src/modules/engines/contract-engine.js.map +0 -1
  466. package/dist/atabey/src/modules/engines/discovery-engine.d.ts +0 -42
  467. package/dist/atabey/src/modules/engines/discovery-engine.js +0 -161
  468. package/dist/atabey/src/modules/engines/discovery-engine.js.map +0 -1
  469. package/dist/atabey/src/modules/engines/file-lock.d.ts +0 -56
  470. package/dist/atabey/src/modules/engines/file-lock.js +0 -171
  471. package/dist/atabey/src/modules/engines/file-lock.js.map +0 -1
  472. package/dist/atabey/src/modules/engines/phase-engine.d.ts +0 -82
  473. package/dist/atabey/src/modules/engines/phase-engine.js +0 -204
  474. package/dist/atabey/src/modules/engines/phase-engine.js.map +0 -1
  475. package/dist/atabey/src/modules/engines/policy-engine.d.ts +0 -63
  476. package/dist/atabey/src/modules/engines/policy-engine.js +0 -188
  477. package/dist/atabey/src/modules/engines/policy-engine.js.map +0 -1
  478. package/dist/atabey/src/modules/engines/sandbox.d.ts +0 -31
  479. package/dist/atabey/src/modules/engines/sandbox.js +0 -57
  480. package/dist/atabey/src/modules/engines/sandbox.js.map +0 -1
  481. package/dist/atabey/src/modules/engines/session-engine.d.ts +0 -68
  482. package/dist/atabey/src/modules/engines/session-engine.js +0 -141
  483. package/dist/atabey/src/modules/engines/session-engine.js.map +0 -1
  484. package/dist/atabey/src/modules/engines/worker-pool.d.ts +0 -8
  485. package/dist/atabey/src/modules/engines/worker-pool.js +0 -9
  486. package/dist/atabey/src/modules/engines/worker-pool.js.map +0 -1
  487. package/dist/atabey/src/modules/providers/llm-provider.d.ts +0 -87
  488. package/dist/atabey/src/modules/providers/llm-provider.js +0 -242
  489. package/dist/atabey/src/modules/providers/llm-provider.js.map +0 -1
  490. package/dist/atabey/src/shared/file-lock.d.ts +0 -1
  491. package/dist/atabey/src/shared/file-lock.js +0 -2
  492. package/dist/atabey/src/shared/file-lock.js.map +0 -1
  493. package/dist/atabey/src/shared/job-queue.d.ts +0 -1
  494. package/dist/atabey/src/shared/job-queue.js +0 -2
  495. package/dist/atabey/src/shared/job-queue.js.map +0 -1
  496. package/dist/atabey/src/shared/lock.d.ts +0 -1
  497. package/dist/atabey/src/shared/lock.js +0 -2
  498. package/dist/atabey/src/shared/lock.js.map +0 -1
  499. package/dist/atabey/src/shared/resilience.d.ts +0 -1
  500. package/dist/atabey/src/shared/resilience.js +0 -2
  501. package/dist/atabey/src/shared/resilience.js.map +0 -1
  502. package/dist/atabey/src/shared/retention.d.ts +0 -1
  503. package/dist/atabey/src/shared/retention.js +0 -2
  504. package/dist/atabey/src/shared/retention.js.map +0 -1
  505. package/dist/atabey/src/shared/sandbox-runtime.d.ts +0 -1
  506. package/dist/atabey/src/shared/sandbox-runtime.js +0 -2
  507. package/dist/atabey/src/shared/sandbox-runtime.js.map +0 -1
  508. package/dist/atabey/src/shared/sandbox.d.ts +0 -1
  509. package/dist/atabey/src/shared/sandbox.js +0 -2
  510. package/dist/atabey/src/shared/sandbox.js.map +0 -1
  511. package/dist/atabey/src/shared/worker-pool.d.ts +0 -1
  512. package/dist/atabey/src/shared/worker-pool.js +0 -2
  513. package/dist/atabey/src/shared/worker-pool.js.map +0 -1
@@ -0,0 +1,419 @@
1
+ /**
2
+ * ─── LOOP DETECTOR ─────────────────────────────────────────────────
3
+ *
4
+ * Detects and prevents AI agents from entering infinite loops.
5
+ * Monitors call patterns across time, file paths, and tools.
6
+ *
7
+ * Detection Patterns:
8
+ * 1. **Consecutive Same Tool** – Same tool called N times in a row
9
+ * 2. **File Churn** – Same file written/read repeatedly
10
+ * 3. **Oscillation** – A → B → A → B alternating pattern
11
+ * 4. **Time-based Throttle** – Too many calls in a short window
12
+ * 5. **Semantic Similarity** – Similar arguments repeated (e.g., same error fix loop)
13
+ * 6. **Content Identity** – Same content being written repeatedly
14
+ *
15
+ * Action:
16
+ * - Cooldown: Block agent for N seconds
17
+ * - Escalate: Notify dashboard/human if loop persists
18
+ * - Kill: Force-stop the agent session
19
+ *
20
+ * Environment Variables:
21
+ * MCP_LOOP_MAX_CONSECUTIVE - Max same tool calls (default: 10)
22
+ * MCP_LOOP_MAX_FILE_CHURN - Max writes to same file (default: 5)
23
+ * MCP_LOOP_COOLDOWN_MS - Cooldown duration (default: 30000)
24
+ * MCP_LOOP_OSCILLATION_WINDOW - Oscillation detection window (default: 6)
25
+ */
26
+ import path from "path";
27
+ import { Storage } from "../../shared/storage.js";
28
+ // ─── Configuration ────────────────────────────────────────────────
29
+ const CONFIG = {
30
+ /** Max consecutive same tool calls before action */
31
+ MAX_CONSECUTIVE: parseInt(process.env.MCP_LOOP_MAX_CONSECUTIVE || "10", 10),
32
+ /** Max writes to the same file before action */
33
+ MAX_FILE_CHURN: parseInt(process.env.MCP_LOOP_MAX_FILE_CHURN || "5", 10),
34
+ /** Max reads of the same file before action */
35
+ MAX_FILE_READ_CHURN: parseInt(process.env.MCP_LOOP_MAX_FILE_READ_CHURN || "10", 10),
36
+ /** Oscillation pattern window (min calls to detect A→B→A→B) */
37
+ OSCILLATION_WINDOW: parseInt(process.env.MCP_LOOP_OSCILLATION_WINDOW || "6", 10),
38
+ /** Cooldown duration in ms */
39
+ COOLDOWN_MS: parseInt(process.env.MCP_LOOP_COOLDOWN_MS || "30000", 10),
40
+ /** Max calls to any tool in sliding window */
41
+ MAX_CALLS_IN_WINDOW: parseInt(process.env.MCP_LOOP_MAX_CALLS_IN_WINDOW || "50", 10),
42
+ /** Sliding window size in ms */
43
+ WINDOW_SIZE_MS: parseInt(process.env.MCP_LOOP_WINDOW_MS || "60000", 10),
44
+ /** Enable/disable loop detector */
45
+ ENABLED: process.env.MCP_LOOP_DETECTION !== "false",
46
+ };
47
+ const agentHistories = new Map();
48
+ // ─── Loop Detector ────────────────────────────────────────────────
49
+ /**
50
+ * Get or create agent history.
51
+ * Loads persisted active cooldown from SQLite if present (restart safety).
52
+ */
53
+ function getOrCreateHistory(agent) {
54
+ if (!agentHistories.has(agent)) {
55
+ const history = {
56
+ calls: [],
57
+ consecutiveToolCalls: new Map(),
58
+ fileWriteCount: new Map(),
59
+ fileReadCount: new Map(),
60
+ lastContentHashes: [],
61
+ inCooldown: false,
62
+ cooldownUntil: 0,
63
+ cooldownCount: 0,
64
+ lastAlert: null,
65
+ };
66
+ // Restore active cooldown from persistent storage
67
+ try {
68
+ const persisted = Storage.getLoopCooldown(agent);
69
+ if (persisted && persisted.cooldownUntil > Date.now()) {
70
+ history.inCooldown = true;
71
+ history.cooldownUntil = persisted.cooldownUntil;
72
+ history.cooldownCount = persisted.cooldownCount;
73
+ history.lastAlert = {
74
+ type: "rate_limit",
75
+ severity: "critical",
76
+ agent,
77
+ detail: persisted.detail || "Restored cooldown after restart",
78
+ timestamp: Date.now(),
79
+ cooldownUntil: persisted.cooldownUntil,
80
+ };
81
+ }
82
+ }
83
+ catch {
84
+ // Non-fatal
85
+ }
86
+ agentHistories.set(agent, history);
87
+ }
88
+ return agentHistories.get(agent);
89
+ }
90
+ /**
91
+ * Prune old calls from history.
92
+ */
93
+ function pruneOldCalls(history) {
94
+ const cutoff = Date.now() - CONFIG.WINDOW_SIZE_MS;
95
+ history.calls = history.calls.filter(c => c.timestamp > cutoff);
96
+ }
97
+ /**
98
+ * Extract file path from tool args if applicable.
99
+ */
100
+ function extractFilePath(toolName, args) {
101
+ if (["write_file", "read_file", "replace_text", "patch_file", "batch_surgical_edit"].includes(toolName)) {
102
+ return args.path || args.filePath || undefined;
103
+ }
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Compute a simple content hash for identity detection.
108
+ */
109
+ function computeContentHash(args) {
110
+ if (args.content && typeof args.content === "string") {
111
+ // Use first 100 chars as hash (fast, good enough for identity)
112
+ return args.content.substring(0, 100);
113
+ }
114
+ return undefined;
115
+ }
116
+ /**
117
+ * Check for oscillation pattern (A → B → A → B).
118
+ */
119
+ function detectOscillation(history, currentTool) {
120
+ const recent = history.calls.slice(-CONFIG.OSCILLATION_WINDOW);
121
+ if (recent.length < 4)
122
+ return false;
123
+ const recentToolNames = [...recent.map(c => c.toolName), currentTool];
124
+ // Check alternating pattern: tool[0] === tool[2] === tool[4] && tool[1] === tool[3] === tool[5]
125
+ if (recentToolNames.length >= 4) {
126
+ if (recentToolNames[0] === recentToolNames[2] &&
127
+ recentToolNames[1] === recentToolNames[3] &&
128
+ recentToolNames[0] !== recentToolNames[1]) {
129
+ // Check if pattern extends to 6
130
+ if (recentToolNames.length >= 6) {
131
+ return recentToolNames[0] === recentToolNames[4] && recentToolNames[1] === recentToolNames[5];
132
+ }
133
+ return true;
134
+ }
135
+ }
136
+ return false;
137
+ }
138
+ /**
139
+ * Detect if same content is being written repeatedly.
140
+ */
141
+ function detectContentIdentity(history, contentHash) {
142
+ if (!contentHash)
143
+ return false;
144
+ const recentHashes = history.lastContentHashes.slice(-5);
145
+ if (recentHashes.length < 3)
146
+ return false;
147
+ // Check if this hash appears 3+ times in last 5
148
+ const hashCount = recentHashes.filter(h => h === contentHash).length;
149
+ if (contentHash === recentHashes[recentHashes.length - 1]) {
150
+ // Count including current
151
+ return hashCount + 1 >= 3;
152
+ }
153
+ return false;
154
+ }
155
+ /**
156
+ * Record a tool call and check for loop patterns.
157
+ * Returns LoopAlert if a loop pattern is detected, null otherwise.
158
+ */
159
+ export function recordAndCheck(agent, toolName, args) {
160
+ if (!CONFIG.ENABLED)
161
+ return null;
162
+ const history = getOrCreateHistory(agent);
163
+ // Check cooldown (in-memory + SQLite-backed; survives MCP restart)
164
+ if (history.inCooldown) {
165
+ if (Date.now() < history.cooldownUntil) {
166
+ return {
167
+ type: "rate_limit",
168
+ severity: "critical",
169
+ agent,
170
+ detail: `Agent "${agent}" is in cooldown for ${Math.ceil((history.cooldownUntil - Date.now()) / 1000)}s. Loop detected earlier.`,
171
+ timestamp: Date.now(),
172
+ cooldownUntil: history.cooldownUntil,
173
+ };
174
+ }
175
+ // Cooldown expired — clear memory + durable store so it cannot resurrect
176
+ history.inCooldown = false;
177
+ history.cooldownUntil = 0;
178
+ try {
179
+ Storage.clearLoopCooldown(agent);
180
+ }
181
+ catch { /* non-fatal */ }
182
+ }
183
+ const filePath = extractFilePath(toolName, args);
184
+ const contentHash = computeContentHash(args);
185
+ const record = {
186
+ agent,
187
+ toolName,
188
+ args,
189
+ timestamp: Date.now(),
190
+ filePath,
191
+ contentHash,
192
+ };
193
+ // Prune old calls
194
+ pruneOldCalls(history);
195
+ // Check 1: Consecutive same tool
196
+ const currentConsecutive = (history.consecutiveToolCalls.get(toolName) || 0) + 1;
197
+ history.consecutiveToolCalls.set(toolName, currentConsecutive);
198
+ // Reset other tools
199
+ for (const [tool] of history.consecutiveToolCalls) {
200
+ if (tool !== toolName) {
201
+ history.consecutiveToolCalls.set(tool, 0);
202
+ }
203
+ }
204
+ if (currentConsecutive >= CONFIG.MAX_CONSECUTIVE) {
205
+ const alert = {
206
+ type: "consecutive_same_tool",
207
+ severity: "critical",
208
+ agent,
209
+ detail: `Agent "${agent}" called "${toolName}" ${currentConsecutive} times consecutively. Possible infinite loop.`,
210
+ timestamp: Date.now(),
211
+ cooldownUntil: Date.now() + CONFIG.COOLDOWN_MS,
212
+ };
213
+ applyCooldown(history, alert, agent);
214
+ return alert;
215
+ }
216
+ // Check 2: File churn (for write operations)
217
+ if (filePath) {
218
+ if (["write_file", "replace_text", "patch_file", "batch_surgical_edit"].includes(toolName)) {
219
+ const writeCount = (history.fileWriteCount.get(filePath) || 0) + 1;
220
+ history.fileWriteCount.set(filePath, writeCount);
221
+ if (writeCount >= CONFIG.MAX_FILE_CHURN) {
222
+ const alert = {
223
+ type: "file_churn",
224
+ severity: "critical",
225
+ agent,
226
+ detail: `Agent "${agent}" wrote to "${path.relative(process.cwd(), filePath)}" ${writeCount} times. Possible file churn loop.`,
227
+ timestamp: Date.now(),
228
+ cooldownUntil: Date.now() + CONFIG.COOLDOWN_MS,
229
+ };
230
+ applyCooldown(history, alert, agent);
231
+ return alert;
232
+ }
233
+ }
234
+ if (toolName === "read_file") {
235
+ const readCount = (history.fileReadCount.get(filePath) || 0) + 1;
236
+ history.fileReadCount.set(filePath, readCount);
237
+ if (readCount >= CONFIG.MAX_FILE_READ_CHURN) {
238
+ const alert = {
239
+ type: "file_churn",
240
+ severity: "warning",
241
+ agent,
242
+ detail: `Agent "${agent}" read "${path.relative(process.cwd(), filePath)}" ${readCount} times. Possible read loop.`,
243
+ timestamp: Date.now(),
244
+ cooldownUntil: null,
245
+ };
246
+ history.lastAlert = alert;
247
+ return alert;
248
+ }
249
+ }
250
+ }
251
+ // Check 3: Oscillation pattern
252
+ if (detectOscillation(history, toolName)) {
253
+ const alert = {
254
+ type: "oscillation",
255
+ severity: "critical",
256
+ agent,
257
+ detail: `Agent "${agent}" is oscillating between tools. Pattern detected in last ${CONFIG.OSCILLATION_WINDOW} calls.`,
258
+ timestamp: Date.now(),
259
+ cooldownUntil: Date.now() + CONFIG.COOLDOWN_MS,
260
+ };
261
+ applyCooldown(history, alert, agent);
262
+ return alert;
263
+ }
264
+ // Check 4: Rate limit (calls in sliding window)
265
+ if (history.calls.length >= CONFIG.MAX_CALLS_IN_WINDOW) {
266
+ const alert = {
267
+ type: "rate_limit",
268
+ severity: "critical",
269
+ agent,
270
+ detail: `Agent "${agent}" made ${history.calls.length} calls in ${CONFIG.WINDOW_SIZE_MS / 1000}s window. Rate limit exceeded.`,
271
+ timestamp: Date.now(),
272
+ cooldownUntil: Date.now() + CONFIG.COOLDOWN_MS,
273
+ };
274
+ applyCooldown(history, alert, agent);
275
+ return alert;
276
+ }
277
+ // Check 5: Content identity (writing same content)
278
+ if (contentHash && detectContentIdentity(history, contentHash)) {
279
+ const alert = {
280
+ type: "content_identity",
281
+ severity: "critical",
282
+ agent,
283
+ detail: `Agent "${agent}" is writing the same content repeatedly. Possible fix-attempt loop.`,
284
+ timestamp: Date.now(),
285
+ cooldownUntil: Date.now() + CONFIG.COOLDOWN_MS,
286
+ };
287
+ applyCooldown(history, alert, agent);
288
+ return alert;
289
+ }
290
+ // If no detection, record the call
291
+ history.calls.push(record);
292
+ // Track content hashes for identity detection
293
+ if (contentHash) {
294
+ history.lastContentHashes.push(contentHash);
295
+ if (history.lastContentHashes.length > 10) {
296
+ history.lastContentHashes.shift();
297
+ }
298
+ }
299
+ return null;
300
+ }
301
+ /**
302
+ * Apply cooldown to an agent.
303
+ */
304
+ function applyCooldown(history, alert, agent) {
305
+ history.inCooldown = true;
306
+ history.cooldownUntil = alert.cooldownUntil || Date.now() + CONFIG.COOLDOWN_MS;
307
+ history.cooldownCount++;
308
+ history.lastAlert = alert;
309
+ // Persist so cooldown survives MCP restart
310
+ try {
311
+ Storage.saveLoopCooldown(agent, history.cooldownUntil, alert.detail, history.cooldownCount);
312
+ }
313
+ catch {
314
+ // Non-fatal, still enforce in-memory
315
+ }
316
+ process.stderr.write(`[LOOP DETECT] ${alert.type}: ${alert.detail}\n`);
317
+ }
318
+ /**
319
+ * Check if an agent is currently in cooldown.
320
+ */
321
+ export function isInCooldown(agent) {
322
+ let history = agentHistories.get(agent);
323
+ // If no in-memory history, try to load persisted cooldown
324
+ if (!history) {
325
+ const persisted = Storage.getLoopCooldown(agent);
326
+ if (persisted) {
327
+ history = getOrCreateHistory(agent); // will load it
328
+ }
329
+ }
330
+ if (!history || !history.inCooldown) {
331
+ return { inCooldown: false, remainingMs: 0, reason: null };
332
+ }
333
+ const remaining = history.cooldownUntil - Date.now();
334
+ if (remaining <= 0) {
335
+ history.inCooldown = false;
336
+ try {
337
+ Storage.clearLoopCooldown(agent);
338
+ }
339
+ catch { /* ignore */ }
340
+ return { inCooldown: false, remainingMs: 0, reason: null };
341
+ }
342
+ return {
343
+ inCooldown: true,
344
+ remainingMs: remaining,
345
+ reason: history.lastAlert?.detail || null,
346
+ };
347
+ }
348
+ /**
349
+ * Manually clear cooldown for an agent.
350
+ */
351
+ export function clearCooldown(agent) {
352
+ const history = agentHistories.get(agent);
353
+ if (history) {
354
+ history.inCooldown = false;
355
+ history.cooldownUntil = 0;
356
+ history.consecutiveToolCalls.clear();
357
+ }
358
+ try {
359
+ Storage.clearLoopCooldown(agent);
360
+ }
361
+ catch {
362
+ /* ignore */
363
+ }
364
+ return true;
365
+ }
366
+ /**
367
+ * Get loop detection stats for an agent.
368
+ */
369
+ export function getLoopStats(agent) {
370
+ const history = agentHistories.get(agent);
371
+ if (!history) {
372
+ return {
373
+ totalCalls: 0,
374
+ recentCalls: 0,
375
+ inCooldown: false,
376
+ cooldownCount: 0,
377
+ consecutiveTools: {},
378
+ fileWrites: {},
379
+ fileReads: {},
380
+ lastAlert: null,
381
+ };
382
+ }
383
+ pruneOldCalls(history);
384
+ return {
385
+ totalCalls: history.calls.length + history.cooldownCount * CONFIG.MAX_CALLS_IN_WINDOW,
386
+ recentCalls: history.calls.length,
387
+ inCooldown: history.inCooldown && Date.now() < history.cooldownUntil,
388
+ cooldownCount: history.cooldownCount,
389
+ consecutiveTools: Object.fromEntries(history.consecutiveToolCalls),
390
+ fileWrites: Object.fromEntries(history.fileWriteCount),
391
+ fileReads: Object.fromEntries(history.fileReadCount),
392
+ lastAlert: history.lastAlert,
393
+ };
394
+ }
395
+ /**
396
+ * Get all agents' loop stats.
397
+ */
398
+ export function getAllLoopStats() {
399
+ const stats = {};
400
+ for (const [agentName] of agentHistories) {
401
+ stats[agentName] = getLoopStats(agentName);
402
+ }
403
+ return stats;
404
+ }
405
+ /**
406
+ * Reset all agent histories.
407
+ * Also clears persisted cooldowns from DB (important for test isolation and clean restarts).
408
+ */
409
+ export function resetLoopDetection() {
410
+ agentHistories.clear();
411
+ try {
412
+ Storage.clearAllLoopCooldowns();
413
+ }
414
+ catch {
415
+ // ignore if storage not ready
416
+ }
417
+ }
418
+ export { CONFIG as LoopDetectorConfig };
419
+ //# sourceMappingURL=loop-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-detector.js","sourceRoot":"","sources":["../../../../../../atabey-mcp/src/mcp/utils/loop-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ─── RULES ENGINE (Prompt Conflict Resolution) ────────────────────
3
+ *
4
+ * Resolves conflicts between AI CLI built-in prompts and Atabey governance rules.
5
+ * Ensures Atabey's critical rules ALWAYS override CLI-level instructions.
6
+ *
7
+ * Priority System:
8
+ * - CRITICAL (P0): Non-bypassable rules (zero any, no console.log, PII masking)
9
+ * - HIGH (P1): Important rules that should not be violated
10
+ * - MEDIUM (P2): Standard best practices
11
+ * - LOW (P3): Recommendations only
12
+ *
13
+ * Enforcement Mechanisms:
14
+ * 1. Pre-execution: Rule validation BEFORE tool runs
15
+ * 2. Post-execution: Scan changed files for violations → auto-rollback
16
+ * 3. CLI System Prompt Override: Inject critical rules at MCP initialization
17
+ */
18
+ export type RulePriority = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
19
+ export interface GovernanceRule {
20
+ id: string;
21
+ name: string;
22
+ description: string;
23
+ priority: RulePriority;
24
+ /** Regex pattern to detect violations in file content */
25
+ detectPattern?: RegExp;
26
+ /** Tool names this rule applies to */
27
+ appliesToTools?: string[];
28
+ /** File extensions this rule applies to (e.g., .ts, .tsx) */
29
+ appliesToExtensions?: string[];
30
+ /** Error message when violated */
31
+ errorMessage: string;
32
+ /** Auto-fix expression (optional) */
33
+ autoFix?: string;
34
+ /** Whether this rule can be bypassed */
35
+ bypassable: boolean;
36
+ }
37
+ declare const GOVERNANCE_RULES: GovernanceRule[];
38
+ /**
39
+ * Get all governance rules.
40
+ */
41
+ export declare function getAllRules(): GovernanceRule[];
42
+ /**
43
+ * Get rules by priority level.
44
+ */
45
+ export declare function getRulesByPriority(priority: RulePriority): GovernanceRule[];
46
+ /**
47
+ * Get non-bypassable rules (CRITICAL + HIGH non-bypassable).
48
+ */
49
+ export declare function getNonBypassableRules(): GovernanceRule[];
50
+ /**
51
+ * Scan file content for rule violations.
52
+ * Returns array of violations found.
53
+ */
54
+ export declare function scanFileForViolations(filePath: string, content: string, options?: {
55
+ includeBypassable?: boolean;
56
+ }): Array<{
57
+ rule: GovernanceRule;
58
+ match: string;
59
+ line: number;
60
+ }>;
61
+ /**
62
+ * Validate tool arguments against governance rules.
63
+ * Returns violation messages if any critical rule is violated.
64
+ */
65
+ export declare function validateArgsAgainstRules(toolName: string, args: Record<string, unknown>): string | null;
66
+ /**
67
+ * Validate tool response for governance violations.
68
+ * Returns violation messages if found.
69
+ */
70
+ export declare function validateResponseAgainstRules(toolName: string, responseText: string): string | null;
71
+ /**
72
+ * Build system prompt override block for CLI initialization.
73
+ * This is injected into the AI's system prompt at MCP connect time.
74
+ */
75
+ export declare function buildSystemPromptOverride(): string;
76
+ /**
77
+ * Add a custom governance rule at runtime.
78
+ */
79
+ export declare function addRule(rule: GovernanceRule): void;
80
+ export { GOVERNANCE_RULES as DefaultGovernanceRules };