claude-flow-novice 2.14.37 → 2.15.1

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 (608) hide show
  1. package/.claude/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
  2. package/.claude/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
  3. package/.claude/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
  4. package/.claude/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
  5. package/.claude/cfn-extras/agents/coordinator.md +182 -0
  6. package/.claude/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
  7. package/.claude/cfn-extras/agents/cost-savings-coordinator.md +173 -0
  8. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
  9. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
  10. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
  11. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
  12. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
  13. package/.claude/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
  14. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
  15. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
  16. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
  17. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
  18. package/.claude/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
  19. package/.claude/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
  20. package/.claude/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
  21. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
  22. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
  23. package/.claude/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
  24. package/.claude/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
  25. package/.claude/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
  26. package/.claude/commands/cfn-docker-core-test-suite.md +326 -0
  27. package/.claude/commands/cfn-loop-cli.md +1 -1
  28. package/.claude/commands/switch-api.md +48 -13
  29. package/.claude/root-claude-distribute/CFN-CLAUDE.md +177 -426
  30. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  31. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  32. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +51 -24
  33. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
  34. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
  35. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
  36. package/.claude/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
  37. package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
  38. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  39. package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  40. package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  41. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  42. package/.claude/skills/cfn-redis-coordination/report-completion.sh +7 -7
  43. package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +2 -0
  44. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +2 -0
  45. package/claude-assets/agents/cfn-dev-team/architecture/planner.md +2 -0
  46. package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +2 -0
  47. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +419 -563
  48. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +2 -0
  49. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +5 -0
  50. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +2 -0
  51. package/claude-assets/agents/cfn-dev-team/documentation/README-VALIDATION.md +2 -0
  52. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +2 -0
  53. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +1 -1
  54. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +1 -1
  55. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +2 -0
  56. package/claude-assets/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +2 -0
  57. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +2 -0
  58. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
  59. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  60. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +2 -0
  61. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +2 -0
  62. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +2 -0
  63. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +4 -0
  64. package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +1 -1
  65. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +825 -17
  66. package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -0
  67. package/claude-assets/agents/docker-ts-fixer.md +56 -0
  68. package/claude-assets/agents/typescript-specialist.md +280 -0
  69. package/claude-assets/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
  70. package/claude-assets/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
  71. package/claude-assets/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
  72. package/claude-assets/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
  73. package/claude-assets/cfn-extras/agents/coordinator.md +182 -0
  74. package/claude-assets/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
  75. package/claude-assets/cfn-extras/agents/cost-savings-coordinator.md +173 -0
  76. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
  77. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
  78. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
  79. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
  80. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
  81. package/claude-assets/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
  82. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
  83. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
  84. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
  85. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
  86. package/claude-assets/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
  87. package/claude-assets/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
  88. package/claude-assets/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
  89. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
  90. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
  91. package/claude-assets/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
  92. package/claude-assets/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
  93. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/SKILL.md +36 -0
  94. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +60 -0
  95. package/claude-assets/cfn-extras/skills/advanced-features/cfn-api-validation/test-endpoints.sh +54 -0
  96. package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/SKILL.md +75 -0
  97. package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/prune-context.sh +73 -0
  98. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/cli-coordination.sh +519 -0
  99. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/mode-detection.sh +326 -0
  100. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +267 -0
  101. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/SKILL.md +33 -0
  102. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +92 -0
  103. package/claude-assets/cfn-extras/skills/analytics/cfn-memory-monitoring/SKILL.md +531 -0
  104. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/SKILL.md +30 -0
  105. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +80 -0
  106. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/SKILL.md +31 -0
  107. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +101 -0
  108. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/collect-metrics.sh +249 -0
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +111 -0
  110. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +192 -0
  111. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +49 -0
  112. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/DESIGN.md +98 -0
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +74 -0
  114. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/SKILL.md +392 -0
  115. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -0
  116. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -0
  117. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -0
  118. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -0
  119. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -0
  120. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/SKILL.md +124 -0
  121. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-ad-performance.sh +105 -0
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +102 -0
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-email-performance.sh +105 -0
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-social-engagement.sh +105 -0
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-website-traffic.sh +107 -0
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/SKILL.md +340 -0
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -0
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -0
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -0
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -0
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -0
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/SKILL.md +350 -0
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +154 -0
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +173 -0
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +147 -0
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +146 -0
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +167 -0
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/SKILL.md +116 -0
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/add-to-segment.sh +78 -0
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/create-contact.sh +113 -0
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/get-contact.sh +86 -0
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +78 -0
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/update-contact.sh +120 -0
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/SKILL.md +106 -0
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/create-campaign.sh +123 -0
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +66 -0
  147. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/list-templates.sh +68 -0
  148. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +85 -0
  149. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/send-test-email.sh +81 -0
  150. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/SKILL.md +366 -0
  151. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-ab-test.sh +231 -0
  152. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-landing-page.sh +190 -0
  153. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/get-page-performance.sh +137 -0
  154. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/publish-page.sh +120 -0
  155. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/unpublish-page.sh +108 -0
  156. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/SKILL.md +202 -0
  157. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +104 -0
  158. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/export-report.sh +92 -0
  159. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +85 -0
  160. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/search-mentions.sh +86 -0
  161. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/SKILL.md +168 -0
  162. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/search-journalists.sh +74 -0
  163. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/send-pitch.sh +80 -0
  164. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/submit-haro-response.sh +88 -0
  165. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +66 -0
  166. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/SKILL.md +159 -0
  167. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/distribute-press-release.sh +94 -0
  168. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-distribution-status.sh +59 -0
  169. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +72 -0
  170. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/list-templates.sh +53 -0
  171. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/SKILL.md +429 -0
  172. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -0
  173. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -0
  174. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -0
  175. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -0
  176. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -0
  177. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/SKILL.md +108 -0
  178. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/create-post.sh +104 -0
  179. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/delete-post.sh +76 -0
  180. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/get-post-stats.sh +66 -0
  181. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/schedule-post.sh +85 -0
  182. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/upload-media.sh +88 -0
  183. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/DESIGN.md +117 -0
  184. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/SKILL.md +679 -0
  185. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-agents.sh +129 -0
  186. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-dashboard.sh +85 -0
  187. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-events.sh +125 -0
  188. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-metrics.sh +112 -0
  189. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-start.sh +135 -0
  190. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-stop.sh +121 -0
  191. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +51 -0
  192. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +85 -0
  193. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/SKILL.md +200 -0
  194. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +244 -0
  195. package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/SKILL.md +279 -0
  196. package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/instrument-process.sh +327 -0
  197. package/claude-assets/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
  198. package/claude-assets/commands/cfn-docker-core-test-suite.md +326 -0
  199. package/claude-assets/commands/cfn-loop-cli.md +1 -1
  200. package/claude-assets/commands/switch-api.md +48 -13
  201. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +177 -426
  202. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  203. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  204. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +51 -24
  205. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
  206. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
  207. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
  208. package/claude-assets/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
  209. package/claude-assets/skills/cfn-docker-wave-execution/SKILL.md +936 -0
  210. package/claude-assets/skills/cfn-docker-wave-execution/cleanup-wave.sh +445 -0
  211. package/claude-assets/skills/cfn-docker-wave-execution/lib/docker-helpers.sh +804 -0
  212. package/claude-assets/skills/cfn-docker-wave-execution/monitor-wave.sh +485 -0
  213. package/claude-assets/skills/cfn-docker-wave-execution/spawn-wave.sh +547 -0
  214. package/claude-assets/skills/cfn-error-batching-strategy/README.md +323 -0
  215. package/claude-assets/skills/cfn-error-batching-strategy/SKILL.md +1016 -0
  216. package/claude-assets/skills/cfn-error-batching-strategy/analyze-errors.sh +327 -0
  217. package/claude-assets/skills/cfn-error-batching-strategy/calculate-waves.sh +256 -0
  218. package/claude-assets/skills/cfn-error-batching-strategy/cli.sh +523 -0
  219. package/claude-assets/skills/cfn-error-batching-strategy/cluster-files.sh +196 -0
  220. package/claude-assets/skills/cfn-error-batching-strategy/create-batches.sh +261 -0
  221. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -0
  222. package/claude-assets/skills/cfn-error-batching-strategy/templates/default-tiers.json +22 -0
  223. package/claude-assets/skills/cfn-error-batching-strategy/tests/test-batching-strategy.sh +498 -0
  224. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
  225. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  226. package/claude-assets/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  227. package/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  228. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  229. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +7 -7
  230. package/claude-assets/skills/cfn-wave-checkpoint/SKILL.md +333 -0
  231. package/claude-assets/skills/cfn-wave-checkpoint/cleanup-orphans.sh +374 -0
  232. package/claude-assets/skills/cfn-wave-checkpoint/resume-wave.sh +325 -0
  233. package/claude-assets/skills/cfn-wave-checkpoint/save-checkpoint.sh +284 -0
  234. package/claude-assets/skills/docker-build/SKILL.md +203 -0
  235. package/claude-assets/skills/docker-build/build.sh +73 -0
  236. package/dist/agent/skill-mcp-selector.js +1 -1
  237. package/dist/agent/skill-mcp-selector.js.map +1 -1
  238. package/dist/agents/agent-loader.js +146 -165
  239. package/dist/agents/agent-loader.js.map +1 -1
  240. package/dist/cli/agent-definition-parser.js +36 -16
  241. package/dist/cli/agent-definition-parser.js.map +1 -1
  242. package/dist/cli/agent-executor.js +48 -13
  243. package/dist/cli/agent-executor.js.map +1 -1
  244. package/dist/cli/agent-prompt-builder.js +28 -2
  245. package/dist/cli/agent-prompt-builder.js.map +1 -1
  246. package/dist/cli/agent-spawn.js +57 -18
  247. package/dist/cli/agent-spawn.js.map +1 -1
  248. package/dist/cli/agent-token-manager.js +5 -1
  249. package/dist/cli/agent-token-manager.js.map +1 -1
  250. package/dist/cli/anthropic-client.js +35 -4
  251. package/dist/cli/anthropic-client.js.map +1 -1
  252. package/dist/cli/cfn-context.js +9 -6
  253. package/dist/cli/cfn-context.js.map +1 -1
  254. package/dist/cli/cfn-metrics.js +8 -1
  255. package/dist/cli/cfn-metrics.js.map +1 -1
  256. package/dist/cli/cfn-redis.js +7 -0
  257. package/dist/cli/cfn-redis.js.map +1 -1
  258. package/dist/cli/conversation-fork.js +14 -11
  259. package/dist/cli/conversation-fork.js.map +1 -1
  260. package/dist/cli/index.js +6 -1
  261. package/dist/cli/index.js.map +1 -1
  262. package/dist/cli/iteration-history.js +8 -5
  263. package/dist/cli/iteration-history.js.map +1 -1
  264. package/dist/coordination/enhanced-progress-tracker.js +1 -1
  265. package/dist/coordination/enhanced-progress-tracker.js.map +1 -1
  266. package/dist/coordination/event-bus.js +1 -1
  267. package/dist/coordination/event-bus.js.map +1 -1
  268. package/dist/coordination/redis-messaging-infrastructure.js +1 -1
  269. package/dist/coordination/redis-messaging-infrastructure.js.map +1 -1
  270. package/dist/mcp/auth-middleware.js +1 -1
  271. package/dist/mcp/auth-middleware.js.map +1 -1
  272. package/dist/mcp/playwright-mcp-server-auth.js +1 -1
  273. package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
  274. package/dist/utils/secret-filter.js +145 -0
  275. package/dist/utils/secret-filter.js.map +1 -0
  276. package/package.json +5 -4
  277. package/scripts/docker-agent-init.sh +106 -0
  278. package/scripts/docker-rebuild-all-agents.sh +127 -0
  279. package/scripts/init-project.js +4 -4
  280. package/scripts/switch-api.sh +151 -16
  281. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  282. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  283. package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  284. package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  285. package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  286. package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  287. package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  288. package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  289. package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  290. package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  291. package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  292. package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  293. package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  294. package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  295. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  296. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  297. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  298. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  299. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  300. package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  301. package/claude-assets/agents/AGENT_LIFECYCLE.md.backup_before_replace +0 -530
  302. package/claude-assets/agents/README-AGENT_LIFECYCLE.md.backup_before_replace +0 -522
  303. package/claude-assets/agents/cfn-dev-team/test-agent.md +0 -141
  304. package/claude-assets/agents/marketing_hybrid/cost_tracker.md +0 -13
  305. package/claude-assets/agents/marketing_hybrid/docker_deployer.md +0 -13
  306. package/claude-assets/agents/marketing_hybrid/zai_worker_spawner.md +0 -13
  307. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  308. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  309. package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  310. package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  311. package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  312. package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  313. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  314. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  315. package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  316. package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  317. package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  318. package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  319. package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  320. package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  321. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  322. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  323. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  324. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  325. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  326. package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  327. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  328. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  329. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  330. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  331. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  332. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  333. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  334. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  335. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  336. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  337. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  338. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  339. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  340. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  341. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  342. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  343. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  344. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  345. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  346. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/SKILL.md +0 -0
  347. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/recommend-swap.sh +0 -0
  348. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-api-validation/test-endpoints.sh +0 -0
  349. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/SKILL.md +0 -0
  350. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/prune-context.sh +0 -0
  351. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  352. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  353. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  354. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  355. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  356. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  357. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  358. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  359. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  360. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  361. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  362. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  363. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  364. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  365. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  366. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  367. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/cli-coordination.sh +0 -0
  368. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/mode-detection.sh +0 -0
  369. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +0 -0
  370. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  371. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  372. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  373. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  374. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  375. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  376. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  377. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  378. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  379. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  380. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  381. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/SKILL.md +0 -0
  382. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/recommend-improvements.sh +0 -0
  383. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-memory-monitoring/SKILL.md +0 -0
  384. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/SKILL.md +0 -0
  385. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/extract-patterns.sh +0 -0
  386. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/SKILL.md +0 -0
  387. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/generate-report.sh +0 -0
  388. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/collect-metrics.sh +0 -0
  389. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/start-telemetry.sh +0 -0
  390. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  391. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  392. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  393. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  394. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  395. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  396. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  397. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  398. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  399. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  400. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  401. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  402. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  403. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  404. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  405. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  406. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  407. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  408. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  409. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  410. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  411. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  412. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  413. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  414. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  415. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  416. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  417. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  418. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  419. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  420. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  421. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  422. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  423. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  424. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  425. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  426. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  427. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  428. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  429. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  430. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  431. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  432. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
  433. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-cli-setup/validate-cli-environment.sh +0 -0
  434. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +0 -0
  435. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/DESIGN.md +0 -0
  436. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +0 -0
  437. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/SKILL.md +0 -0
  438. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/create-campaign.sh +0 -0
  439. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +0 -0
  440. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +0 -0
  441. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/set-budget.sh +0 -0
  442. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +0 -0
  443. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/SKILL.md +0 -0
  444. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-ad-performance.sh +0 -0
  445. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +0 -0
  446. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-email-performance.sh +0 -0
  447. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-social-engagement.sh +0 -0
  448. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-website-traffic.sh +0 -0
  449. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/SKILL.md +0 -0
  450. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +0 -0
  451. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +0 -0
  452. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +0 -0
  453. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/send-message.sh +0 -0
  454. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +0 -0
  455. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/SKILL.md +0 -0
  456. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +0 -0
  457. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +0 -0
  458. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +0 -0
  459. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +0 -0
  460. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +0 -0
  461. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/SKILL.md +0 -0
  462. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/add-to-segment.sh +0 -0
  463. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/create-contact.sh +0 -0
  464. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/get-contact.sh +0 -0
  465. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +0 -0
  466. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/update-contact.sh +0 -0
  467. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/SKILL.md +0 -0
  468. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/create-campaign.sh +0 -0
  469. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +0 -0
  470. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/list-templates.sh +0 -0
  471. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +0 -0
  472. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/send-test-email.sh +0 -0
  473. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/SKILL.md +0 -0
  474. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-ab-test.sh +0 -0
  475. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-landing-page.sh +0 -0
  476. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/get-page-performance.sh +0 -0
  477. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/publish-page.sh +0 -0
  478. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/unpublish-page.sh +0 -0
  479. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/SKILL.md +0 -0
  480. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +0 -0
  481. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/export-report.sh +0 -0
  482. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +0 -0
  483. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/search-mentions.sh +0 -0
  484. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/SKILL.md +0 -0
  485. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/search-journalists.sh +0 -0
  486. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/send-pitch.sh +0 -0
  487. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/submit-haro-response.sh +0 -0
  488. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +0 -0
  489. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/SKILL.md +0 -0
  490. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/distribute-press-release.sh +0 -0
  491. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-distribution-status.sh +0 -0
  492. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +0 -0
  493. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/list-templates.sh +0 -0
  494. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/SKILL.md +0 -0
  495. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/create-campaign.sh +0 -0
  496. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +0 -0
  497. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/opt-out.sh +0 -0
  498. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +0 -0
  499. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/send-sms.sh +0 -0
  500. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/SKILL.md +0 -0
  501. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/create-post.sh +0 -0
  502. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/delete-post.sh +0 -0
  503. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/get-post-stats.sh +0 -0
  504. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/schedule-post.sh +0 -0
  505. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/upload-media.sh +0 -0
  506. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/DESIGN.md +0 -0
  507. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/SKILL.md +0 -0
  508. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-agents.sh +0 -0
  509. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-dashboard.sh +0 -0
  510. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-events.sh +0 -0
  511. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-metrics.sh +0 -0
  512. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-start.sh +0 -0
  513. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-stop.sh +0 -0
  514. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/test-web-portal-skill.sh +0 -0
  515. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/validate-deployment.sh +0 -0
  516. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/SKILL.md +0 -0
  517. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/sanitize-environment.sh +0 -0
  518. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/SKILL.md +0 -0
  519. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/instrument-process.sh +0 -0
  520. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  521. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  522. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  523. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  524. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  525. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  526. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  527. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  528. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  529. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  530. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  531. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  532. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  533. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  534. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  535. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  536. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  537. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  538. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  539. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  540. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  541. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  542. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  543. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  544. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  545. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  546. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  547. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  548. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  549. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  550. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  551. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  552. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  553. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  554. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  555. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  556. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  557. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  558. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  559. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  560. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  561. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  562. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  563. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  564. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  565. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  566. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  567. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  568. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  569. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  570. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  571. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  572. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  573. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  574. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  575. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  576. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  577. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  578. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  579. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  580. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  581. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  582. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  583. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  584. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  585. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  586. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  587. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  588. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  589. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  590. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  591. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  592. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  593. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  594. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  595. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  596. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  597. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  598. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  599. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  600. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  601. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  602. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  603. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  604. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  605. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  606. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  607. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  608. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/coordination/redis-messaging-infrastructure.ts"],"sourcesContent":["/**\n * Enhanced Redis Messaging Infrastructure for Agent Coordination\n * \n * Provides a comprehensive messaging layer for real-time agent communication,\n * progress tracking, and coordination with support for:\n * - Granular progress updates with confidence scoring\n * - Agent visibility and status tracking\n * - Swarm-wide coordination and signaling\n * - Secure message authentication and validation\n * - Performance monitoring and analytics\n */\n\nimport { EventEmitter } from 'events';\nimport { createClient, RedisClientType } from 'redis';\nimport { Logger } from '../core/logger.js';\nimport type { LoggingConfig } from '../utils/types.js';\nimport { \n EnhancedProgressTracker, \n TaskProgress, \n AgentVisibility, \n SwarmProgressOverview,\n ProgressUpdateMessage,\n REDIS_CHANNELS,\n REDIS_KEYS\n} from './enhanced-progress-tracker.js';\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Message types for agent coordination\n */\nexport type MessageType = \n | 'task_assignment'\n | 'task_progress'\n | 'task_completion'\n | 'task_failure'\n | 'agent_status'\n | 'coordination_request'\n | 'coordination_response'\n | 'swarm_status'\n | 'heartbeat'\n | 'error'\n | 'shutdown';\n\n/**\n * Base message structure\n */\nexport interface BaseMessage {\n id: string;\n type: MessageType;\n from: string;\n to?: string | string[];\n swarmId: string;\n timestamp: number;\n payload: any;\n priority: 'low' | 'normal' | 'high' | 'critical';\n signature?: string;\n metadata?: {\n retryCount?: number;\n maxRetries?: number;\n timeout?: number;\n correlationId?: string;\n expiresAt?: number;\n };\n}\n\n/**\n * Agent coordination message\n */\nexport interface CoordinationMessage extends BaseMessage {\n type: 'coordination_request' | 'coordination_response';\n payload: {\n action: 'handoff' | 'request' | 'approve' | 'reject' | 'block' | 'unblock';\n targetTask?: string;\n reason?: string;\n data?: any;\n };\n}\n\n/**\n * Task assignment message\n */\nexport interface TaskAssignmentMessage extends BaseMessage {\n type: 'task_assignment';\n payload: {\n taskId: string;\n taskType: string;\n taskDescription: string;\n requirements?: string[];\n dependencies?: string[];\n deadline?: number;\n priority: number;\n };\n}\n\n/**\n * Heartbeat message for agent health monitoring\n */\nexport interface HeartbeatMessage extends BaseMessage {\n type: 'heartbeat';\n payload: {\n status: 'healthy' | 'degraded' | 'unhealthy';\n load: number;\n memoryUsage: number;\n cpuUsage: number;\n activeTasks: number;\n lastActivity: number;\n };\n}\n\n/**\n * Message delivery options\n */\nexport interface MessageOptions {\n priority?: 'low' | 'normal' | 'high' | 'critical';\n timeout?: number;\n maxRetries?: number;\n persistent?: boolean;\n encrypt?: boolean;\n}\n\n/**\n * Messaging infrastructure configuration\n */\nexport interface MessagingConfig {\n redisUrl?: string;\n hmacSecret?: string;\n messageRetention?: number;\n heartbeatInterval?: number;\n maxMessageSize?: number;\n rateLimitPerSecond?: number;\n enableEncryption?: boolean;\n}\n\n// ===== REDIS MESSAGING INFRASTRUCTURE CLASS =====\n\nexport class RedisMessagingInfrastructure extends EventEmitter {\n private redis: RedisClientType;\n private subscriber: RedisClientType;\n private publisher: RedisClientType;\n private logger: Logger;\n private progressTracker: EnhancedProgressTracker;\n private config: Required<MessagingConfig>;\n \n // State management\n private agentId: string;\n private swarmId: string;\n private isInitialized = false;\n private subscriptions = new Map<string, Set<(message: BaseMessage) => void>>();\n private heartbeatInterval?: NodeJS.Timeout;\n private messageQueue = new Map<string, BaseMessage>();\n private rateLimitMap = new Map<string, number[]>();\n\n constructor(\n agentId: string,\n swarmId: string,\n config: MessagingConfig = {},\n loggerConfig?: LoggingConfig\n ) {\n super();\n \n this.agentId = agentId;\n this.swarmId = swarmId;\n \n // Default configuration\n this.config = {\n redisUrl: config.redisUrl || process.env.REDIS_URL || 'redis://localhost:6379',\n hmacSecret: config.hmacSecret || process.env.HMAC_SECRET || 'default-secret',\n messageRetention: config.messageRetention || 3600000, // 1 hour\n heartbeatInterval: config.heartbeatInterval || 30000, // 30 seconds\n maxMessageSize: config.maxMessageSize || 1048576, // 1MB\n rateLimitPerSecond: config.rateLimitPerSecond || 100,\n enableEncryption: config.enableEncryption || false\n };\n\n // Initialize logger\n const logConfig: LoggingConfig = loggerConfig || {\n level: process.env.CLAUDE_FLOW_ENV === 'test' ? 'error' : 'info',\n format: 'json',\n destination: 'console'\n };\n this.logger = new Logger(logConfig, { component: 'RedisMessagingInfrastructure' });\n\n // Initialize Redis clients\n this.redis = createClient({ url: this.config.redisUrl });\n this.subscriber = createClient({ url: this.config.redisUrl });\n this.publisher = createClient({ url: this.config.redisUrl });\n\n // Initialize progress tracker\n this.progressTracker = new EnhancedProgressTracker(\n this.config.redisUrl,\n loggerConfig,\n this.config.hmacSecret\n );\n\n this.setupRedisClients();\n }\n\n /**\n * Initialize the messaging infrastructure\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n // Connect all Redis clients\n await Promise.all([\n this.redis.connect(),\n this.subscriber.connect(),\n this.publisher.connect(),\n this.progressTracker.initialize()\n ]);\n\n // Set up default subscriptions\n await this.setupDefaultSubscriptions();\n\n // Start heartbeat\n this.startHeartbeat();\n\n this.isInitialized = true;\n this.logger.info('Redis Messaging Infrastructure initialized', {\n agentId: this.agentId,\n swarmId: this.swarmId,\n redisConnected: true\n });\n\n this.emit('initialized');\n } catch (error) {\n this.logger.error('Failed to initialize Redis Messaging Infrastructure', {\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n /**\n * Send a message to specific agents or broadcast to swarm\n */\n async sendMessage(\n type: MessageType,\n payload: any,\n recipients?: string | string[],\n options: MessageOptions = {}\n ): Promise<string> {\n if (!this.isInitialized) {\n throw new Error('Messaging infrastructure not initialized');\n }\n\n const messageId = this.generateMessageId();\n const message: BaseMessage = {\n id: messageId,\n type,\n from: this.agentId,\n to: recipients,\n swarmId: this.swarmId,\n timestamp: Date.now(),\n payload,\n priority: options.priority || 'normal',\n signature: undefined,\n metadata: {\n retryCount: 0,\n maxRetries: options.maxRetries || 3,\n timeout: options.timeout || 30000,\n correlationId: this.generateCorrelationId(),\n expiresAt: Date.now() + (options.timeout || 30000)\n }\n };\n\n // Validate message\n await this.validateMessage(message);\n\n // Add signature\n message.signature = this.generateMessageSignature(message);\n\n // Store message for potential retries\n if (options.persistent !== false) {\n await this.storeMessage(message);\n }\n\n // Send message\n await this.publishMessage(message);\n\n this.logger.debug('Message sent', {\n messageId,\n type,\n recipients: recipients || 'broadcast',\n priority: message.priority\n });\n\n return messageId;\n }\n\n /**\n * Send task assignment to specific agent\n */\n async sendTaskAssignment(\n agentId: string,\n taskId: string,\n taskType: string,\n taskDescription: string,\n requirements?: string[],\n dependencies?: string[],\n deadline?: number\n ): Promise<string> {\n return await this.sendMessage('task_assignment', {\n taskId,\n taskType,\n taskDescription,\n requirements,\n dependencies,\n deadline,\n priority: this.calculateTaskPriority(taskType, requirements)\n }, agentId, { priority: 'high', persistent: true });\n }\n\n /**\n * Send coordination request to agent\n */\n async sendCoordinationRequest(\n targetAgentId: string,\n action: CoordinationMessage['payload']['action'],\n targetTask?: string,\n reason?: string,\n data?: any\n ): Promise<string> {\n return await this.sendMessage('coordination_request', {\n action,\n targetTask,\n reason,\n data\n }, targetAgentId, { priority: 'high' });\n }\n\n /**\n * Send coordination response\n */\n async sendCoordinationResponse(\n targetAgentId: string,\n action: CoordinationMessage['payload']['action'],\n originalMessageId: string,\n reason?: string,\n data?: any\n ): Promise<string> {\n return await this.sendMessage('coordination_response', {\n action,\n originalMessageId,\n reason,\n data\n }, targetAgentId, { priority: 'high' });\n }\n\n /**\n * Subscribe to messages from specific agents or message types\n */\n async subscribe(\n filter: {\n fromAgents?: string[];\n messageTypes?: MessageType[];\n priority?: ('low' | 'normal' | 'high' | 'critical')[];\n },\n callback: (message: BaseMessage) => void | Promise<void>\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n \n if (!this.subscriptions.has(subscriptionKey)) {\n this.subscriptions.set(subscriptionKey, new Set());\n }\n \n this.subscriptions.get(subscriptionKey)!.add(callback);\n\n // Subscribe to relevant Redis channels\n const channels = this.getChannelsForFilter(filter);\n for (const channel of channels) {\n await this.subscriber.subscribe(channel, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n \n // Apply filter\n if (!this.matchesFilter(parsedMessage, filter)) return;\n \n // Validate signature\n if (!this.validateMessageSignature(parsedMessage)) {\n this.logger.warn('Invalid message signature received', {\n messageId: parsedMessage.id,\n from: parsedMessage.from\n });\n return;\n }\n \n // Check expiration\n if (parsedMessage.metadata?.expiresAt && Date.now() > parsedMessage.metadata.expiresAt) {\n this.logger.debug('Expired message ignored', {\n messageId: parsedMessage.id\n });\n return;\n }\n \n await callback(parsedMessage);\n } catch (error) {\n this.logger.error('Error processing subscribed message', {\n error: error instanceof Error ? error.message : String(error),\n channel\n });\n }\n });\n }\n\n this.logger.debug('Subscribed to messages', { filter });\n }\n\n /**\n * Unsubscribe from messages\n */\n async unsubscribe(\n filter: Record<string, string[]>,\n callback?: (message: BaseMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n const subscriptions = this.subscriptions.get(subscriptionKey);\n \n if (subscriptions) {\n if (callback) {\n subscriptions.delete(callback);\n } else {\n subscriptions.clear();\n }\n \n if (subscriptions.size === 0) {\n this.subscriptions.delete(subscriptionKey);\n }\n }\n }\n\n /**\n * Get progress tracker instance\n */\n getProgressTracker(): EnhancedProgressTracker {\n return this.progressTracker;\n }\n\n /**\n * Get agent visibility information\n */\n async getAgentVisibility(agentId?: string): Promise<AgentVisibility | null> {\n if (agentId) {\n return await this.progressTracker.getAgentVisibility(agentId);\n }\n \n // Return current agent's visibility\n return await this.progressTracker.getAgentVisibility(this.agentId);\n }\n\n /**\n * Get swarm progress overview\n */\n async getSwarmOverview(): Promise<SwarmProgressOverview | null> {\n return await this.progressTracker.getSwarmOverview(this.swarmId);\n }\n\n /**\n * Update current agent's visibility\n */\n async updateAgentVisibility(updates: Partial<AgentVisibility>): Promise<void> {\n await this.progressTracker.updateAgentVisibility(this.agentId, updates);\n }\n\n /**\n * Broadcast agent status to swarm\n */\n async broadcastStatus(status: AgentVisibility['status'], details?: any): Promise<void> {\n await this.sendMessage('agent_status', {\n status,\n details,\n timestamp: Date.now()\n }, undefined, { priority: 'normal' });\n\n await this.updateAgentVisibility({ status });\n }\n\n /**\n * Get message history for agent or swarm\n */\n async getMessageHistory(\n filter: {\n agentId?: string;\n messageTypes?: MessageType[];\n timeRange?: { start: number; end: number };\n limit?: number;\n }\n ): Promise<BaseMessage[]> {\n const pattern = filter.agentId \n ? `messages:${this.swarmId}:${filter.agentId}:*`\n : `messages:${this.swarmId}:*`;\n \n const keys = await this.redis.keys(pattern);\n const messages: BaseMessage[] = [];\n\n for (const key of keys.slice(0, filter.limit || 100)) {\n const messageData = await this.redis.get(key);\n if (messageData) {\n const message: BaseMessage = JSON.parse(messageData);\n \n // Apply filters\n if (filter.messageTypes && !filter.messageTypes.includes(message.type)) continue;\n if (filter.timeRange) {\n if (message.timestamp < filter.timeRange.start || message.timestamp > filter.timeRange.end) continue;\n }\n \n messages.push(message);\n }\n }\n\n return messages.sort((a, b) => b.timestamp - a.timestamp);\n }\n\n /**\n * Cleanup resources and shutdown\n */\n async cleanup(): Promise<void> {\n try {\n // Stop heartbeat\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n // Send shutdown message\n if (this.isInitialized) {\n await this.sendMessage('shutdown', {\n reason: 'Agent shutdown',\n timestamp: Date.now()\n }, undefined, { priority: 'normal' });\n }\n\n // Cleanup resources\n await Promise.all([\n this.progressTracker.cleanup(),\n this.redis.quit(),\n this.subscriber.quit(),\n this.publisher.quit()\n ]);\n\n this.subscriptions.clear();\n this.messageQueue.clear();\n this.rateLimitMap.clear();\n this.isInitialized = false;\n\n this.logger.info('Redis Messaging Infrastructure cleaned up');\n } catch (error) {\n this.logger.error('Error during cleanup', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n // ===== PRIVATE METHODS =====\n\n private setupRedisClients(): void {\n const setupClient = (client: RedisClientType, name: string) => {\n client.on('error', (err) => {\n this.logger.error(`${name} client error`, { error: err.message });\n });\n\n client.on('connect', () => {\n this.logger.debug(`${name} client connected`);\n });\n\n client.on('disconnect', () => {\n this.logger.warn(`${name} client disconnected`);\n });\n };\n\n setupClient(this.redis, 'Main Redis');\n setupClient(this.subscriber, 'Redis Subscriber');\n setupClient(this.publisher, 'Redis Publisher');\n }\n\n private async setupDefaultSubscriptions(): Promise<void> {\n // Subscribe to agent-specific messages\n await this.subscriber.subscribe(`agent:${this.agentId}:messages`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n await this.handleIncomingMessage(parsedMessage);\n } catch (error) {\n this.logger.error('Error handling agent message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n\n // Subscribe to swarm-wide messages\n await this.subscriber.subscribe(`swarm:${this.swarmId}:broadcast`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n if (parsedMessage.to === undefined || parsedMessage.to === this.agentId) {\n await this.handleIncomingMessage(parsedMessage);\n }\n } catch (error) {\n this.logger.error('Error handling broadcast message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n\n // Subscribe to coordination messages\n await this.subscriber.subscribe(`swarm:${this.swarmId}:coordination`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n if (parsedMessage.type === 'coordination_request' || parsedMessage.type === 'coordination_response') {\n await this.handleIncomingMessage(parsedMessage);\n }\n } catch (error) {\n this.logger.error('Error handling coordination message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n }\n\n private async handleIncomingMessage(message: BaseMessage): Promise<void> {\n // Update agent activity\n await this.updateAgentActivity(message.from);\n\n // Emit message event\n this.emit('message', message);\n\n // Handle specific message types\n switch (message.type) {\n case 'task_assignment':\n this.emit('task-assigned', message);\n break;\n case 'coordination_request':\n this.emit('coordination-request', message);\n break;\n case 'coordination_response':\n this.emit('coordination-response', message);\n break;\n case 'heartbeat':\n this.emit('heartbeat', message);\n break;\n case 'shutdown':\n this.emit('agent-shutdown', message);\n break;\n }\n }\n\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(async () => {\n try {\n const heartbeat: HeartbeatMessage = {\n id: this.generateMessageId(),\n type: 'heartbeat',\n from: this.agentId,\n swarmId: this.swarmId,\n timestamp: Date.now(),\n payload: {\n status: 'healthy',\n load: await this.getCurrentLoad(),\n memoryUsage: process.memoryUsage().heapUsed / 1024 / 1024, // MB\n cpuUsage: 0, // Would need to implement CPU monitoring\n activeTasks: (await this.progressTracker.getActiveTasks(this.agentId)).length,\n lastActivity: Date.now()\n },\n priority: 'low'\n };\n\n await this.publisher.publish(\n `swarm:${this.swarmId}:heartbeat`,\n JSON.stringify(heartbeat)\n );\n } catch (error) {\n this.logger.error('Error sending heartbeat', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }, this.config.heartbeatInterval);\n }\n\n private async validateMessage(message: BaseMessage): Promise<void> {\n // Size validation\n const messageSize = JSON.stringify(message).length;\n if (messageSize > this.config.maxMessageSize) {\n throw new Error(`Message size ${messageSize} exceeds maximum ${this.config.maxMessageSize}`);\n }\n\n // Rate limiting\n const key = `${message.from}:${Math.floor(Date.now() / 1000)}`;\n const requests = this.rateLimitMap.get(key) || [];\n requests.push(Date.now());\n \n if (requests.length > this.config.rateLimitPerSecond) {\n throw new Error(`Rate limit exceeded for agent ${message.from}`);\n }\n \n this.rateLimitMap.set(key, requests);\n \n // Cleanup old rate limit entries\n setTimeout(() => {\n this.rateLimitMap.delete(key);\n }, 5000);\n }\n\n private generateMessageSignature(message: BaseMessage): string {\n const crypto = require('crypto');\n const payload = JSON.stringify({\n id: message.id,\n type: message.type,\n from: message.from,\n swarmId: message.swarmId,\n timestamp: message.timestamp\n });\n \n return crypto.createHmac('sha256', this.config.hmacSecret)\n .update(payload)\n .digest('hex');\n }\n\n private validateMessageSignature(message: BaseMessage): boolean {\n if (!message.signature) return false;\n \n const expectedSignature = this.generateMessageSignature(message);\n return message.signature === expectedSignature;\n }\n\n private async storeMessage(message: BaseMessage): Promise<void> {\n const key = `messages:${message.swarmId}:${message.from}:${message.id}`;\n await this.redis.setEx(\n key,\n Math.ceil(this.config.messageRetention / 1000),\n JSON.stringify(message)\n );\n }\n\n private async publishMessage(message: BaseMessage): Promise<void> {\n const messageData = JSON.stringify(message);\n\n if (message.to) {\n // Send to specific agents\n const recipients = Array.isArray(message.to) ? message.to : [message.to];\n for (const recipient of recipients) {\n await this.publisher.publish(`agent:${recipient}:messages`, messageData);\n }\n } else {\n // Broadcast to swarm\n await this.publisher.publish(`swarm:${message.swarmId}:broadcast`, messageData);\n }\n\n // Also publish to coordination channel if relevant\n if (['coordination_request', 'coordination_response'].includes(message.type)) {\n await this.publisher.publish(`swarm:${message.swarmId}:coordination`, messageData);\n }\n }\n\n private getChannelsForFilter(filter: Record<string, string[]>): string[] {\n const channels: string[] = [];\n\n if (filter.fromAgents) {\n // Subscribe to specific agent channels\n for (const agentId of filter.fromAgents) {\n channels.push(`agent:${agentId}:messages`);\n }\n } else {\n // Subscribe to all agent and swarm channels\n channels.push(`agent:${this.agentId}:messages`);\n channels.push(`swarm:${this.swarmId}:broadcast`);\n channels.push(`swarm:${this.swarmId}:coordination`);\n }\n\n return channels;\n }\n\n private matchesFilter(message: BaseMessage, filter: Record<string, string[]>): boolean {\n if (filter.fromAgents && !filter.fromAgents.includes(message.from)) return false;\n if (filter.messageTypes && !filter.messageTypes.includes(message.type)) return false;\n if (filter.priority && !filter.priority.includes(message.priority)) return false;\n \n return true;\n }\n\n private generateMessageId(): string {\n return `msg-${this.agentId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private generateCorrelationId(): string {\n return `corr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private calculateTaskPriority(taskType: string, requirements?: string[]): number {\n // Simple priority calculation based on task type and requirements\n const basePriority = {\n 'critical': 10,\n 'urgent': 8,\n 'high': 6,\n 'normal': 4,\n 'low': 2\n }[taskType.toLowerCase()] || 4;\n\n const requirementBonus = (requirements?.length || 0) * 0.5;\n return Math.min(10, basePriority + requirementBonus);\n }\n\n private async getCurrentLoad(): Promise<number> {\n const activeTasks = await this.progressTracker.getActiveTasks(this.agentId);\n return activeTasks.length / 5; // Normalize to 0-1 range (assuming max 5 concurrent tasks)\n }\n\n private async updateAgentActivity(agentId: string): Promise<void> {\n const key = `agent:activity:${agentId}`;\n await this.redis.setEx(key, 300, Date.now().toString()); // 5 minutes TTL\n }\n}\n\n// ===== FACTORY FUNCTION =====\n\nexport function createRedisMessagingInfrastructure(\n agentId: string,\n swarmId: string,\n config?: MessagingConfig,\n loggerConfig?: LoggingConfig\n): RedisMessagingInfrastructure {\n return new RedisMessagingInfrastructure(agentId, swarmId, config, loggerConfig);\n}\n\n// ===== EXPORTS =====\n\nexport default RedisMessagingInfrastructure;"],"names":["EventEmitter","createClient","Logger","EnhancedProgressTracker","RedisMessagingInfrastructure","redis","subscriber","publisher","logger","progressTracker","config","agentId","swarmId","isInitialized","subscriptions","Map","heartbeatInterval","messageQueue","rateLimitMap","loggerConfig","redisUrl","process","env","REDIS_URL","hmacSecret","HMAC_SECRET","messageRetention","maxMessageSize","rateLimitPerSecond","enableEncryption","logConfig","level","CLAUDE_FLOW_ENV","format","destination","component","url","setupRedisClients","initialize","Promise","all","connect","setupDefaultSubscriptions","startHeartbeat","info","redisConnected","emit","error","Error","message","String","sendMessage","type","payload","recipients","options","messageId","generateMessageId","id","from","to","timestamp","Date","now","priority","signature","undefined","metadata","retryCount","maxRetries","timeout","correlationId","generateCorrelationId","expiresAt","validateMessage","generateMessageSignature","persistent","storeMessage","publishMessage","debug","sendTaskAssignment","taskId","taskType","taskDescription","requirements","dependencies","deadline","calculateTaskPriority","sendCoordinationRequest","targetAgentId","action","targetTask","reason","data","sendCoordinationResponse","originalMessageId","subscribe","filter","callback","subscriptionKey","JSON","stringify","has","set","Set","get","add","channels","getChannelsForFilter","channel","parsedMessage","parse","matchesFilter","validateMessageSignature","warn","unsubscribe","delete","clear","size","getProgressTracker","getAgentVisibility","getSwarmOverview","updateAgentVisibility","updates","broadcastStatus","status","details","getMessageHistory","pattern","keys","messages","key","slice","limit","messageData","messageTypes","includes","timeRange","start","end","push","sort","a","b","cleanup","clearInterval","quit","setupClient","client","name","on","err","handleIncomingMessage","updateAgentActivity","setInterval","heartbeat","load","getCurrentLoad","memoryUsage","heapUsed","cpuUsage","activeTasks","getActiveTasks","length","lastActivity","publish","messageSize","Math","floor","requests","setTimeout","crypto","require","createHmac","update","digest","expectedSignature","setEx","ceil","Array","isArray","recipient","fromAgents","random","toString","substr","basePriority","toLowerCase","requirementBonus","min","createRedisMessagingInfrastructure"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/coordination/redis-messaging-infrastructure.ts"],"sourcesContent":["/**\n * Enhanced Redis Messaging Infrastructure for Agent Coordination\n * \n * Provides a comprehensive messaging layer for real-time agent communication,\n * progress tracking, and coordination with support for:\n * - Granular progress updates with confidence scoring\n * - Agent visibility and status tracking\n * - Swarm-wide coordination and signaling\n * - Secure message authentication and validation\n * - Performance monitoring and analytics\n */\n\nimport { EventEmitter } from 'events';\nimport { createClient, RedisClientType } from 'redis';\nimport { Logger } from '../core/logger.js';\nimport type { LoggingConfig } from '../utils/types.js';\nimport { \n EnhancedProgressTracker, \n TaskProgress, \n AgentVisibility, \n SwarmProgressOverview,\n ProgressUpdateMessage,\n REDIS_CHANNELS,\n REDIS_KEYS\n} from './enhanced-progress-tracker.js';\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Message types for agent coordination\n */\nexport type MessageType = \n | 'task_assignment'\n | 'task_progress'\n | 'task_completion'\n | 'task_failure'\n | 'agent_status'\n | 'coordination_request'\n | 'coordination_response'\n | 'swarm_status'\n | 'heartbeat'\n | 'error'\n | 'shutdown';\n\n/**\n * Base message structure\n */\nexport interface BaseMessage {\n id: string;\n type: MessageType;\n from: string;\n to?: string | string[];\n swarmId: string;\n timestamp: number;\n payload: any;\n priority: 'low' | 'normal' | 'high' | 'critical';\n signature?: string;\n metadata?: {\n retryCount?: number;\n maxRetries?: number;\n timeout?: number;\n correlationId?: string;\n expiresAt?: number;\n };\n}\n\n/**\n * Agent coordination message\n */\nexport interface CoordinationMessage extends BaseMessage {\n type: 'coordination_request' | 'coordination_response';\n payload: {\n action: 'handoff' | 'request' | 'approve' | 'reject' | 'block' | 'unblock';\n targetTask?: string;\n reason?: string;\n data?: any;\n };\n}\n\n/**\n * Task assignment message\n */\nexport interface TaskAssignmentMessage extends BaseMessage {\n type: 'task_assignment';\n payload: {\n taskId: string;\n taskType: string;\n taskDescription: string;\n requirements?: string[];\n dependencies?: string[];\n deadline?: number;\n priority: number;\n };\n}\n\n/**\n * Heartbeat message for agent health monitoring\n */\nexport interface HeartbeatMessage extends BaseMessage {\n type: 'heartbeat';\n payload: {\n status: 'healthy' | 'degraded' | 'unhealthy';\n load: number;\n memoryUsage: number;\n cpuUsage: number;\n activeTasks: number;\n lastActivity: number;\n };\n}\n\n/**\n * Message delivery options\n */\nexport interface MessageOptions {\n priority?: 'low' | 'normal' | 'high' | 'critical';\n timeout?: number;\n maxRetries?: number;\n persistent?: boolean;\n encrypt?: boolean;\n}\n\n/**\n * Messaging infrastructure configuration\n */\nexport interface MessagingConfig {\n redisUrl?: string;\n hmacSecret?: string;\n messageRetention?: number;\n heartbeatInterval?: number;\n maxMessageSize?: number;\n rateLimitPerSecond?: number;\n enableEncryption?: boolean;\n}\n\n// ===== REDIS MESSAGING INFRASTRUCTURE CLASS =====\n\nexport class RedisMessagingInfrastructure extends EventEmitter {\n private redis: RedisClientType;\n private subscriber: RedisClientType;\n private publisher: RedisClientType;\n private logger: Logger;\n private progressTracker: EnhancedProgressTracker;\n private config: Required<MessagingConfig>;\n \n // State management\n private agentId: string;\n private swarmId: string;\n private isInitialized = false;\n private subscriptions = new Map<string, Set<(message: BaseMessage) => void>>();\n private heartbeatInterval?: NodeJS.Timeout;\n private messageQueue = new Map<string, BaseMessage>();\n private rateLimitMap = new Map<string, number[]>();\n\n constructor(\n agentId: string,\n swarmId: string,\n config: MessagingConfig = {},\n loggerConfig?: LoggingConfig\n ) {\n super();\n \n this.agentId = agentId;\n this.swarmId = swarmId;\n \n // Default configuration\n this.config = {\n redisUrl: config.redisUrl || process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,\n hmacSecret: config.hmacSecret || process.env.HMAC_SECRET || 'default-secret',\n messageRetention: config.messageRetention || 3600000, // 1 hour\n heartbeatInterval: config.heartbeatInterval || 30000, // 30 seconds\n maxMessageSize: config.maxMessageSize || 1048576, // 1MB\n rateLimitPerSecond: config.rateLimitPerSecond || 100,\n enableEncryption: config.enableEncryption || false\n };\n\n // Initialize logger\n const logConfig: LoggingConfig = loggerConfig || {\n level: process.env.CLAUDE_FLOW_ENV === 'test' ? 'error' : 'info',\n format: 'json',\n destination: 'console'\n };\n this.logger = new Logger(logConfig, { component: 'RedisMessagingInfrastructure' });\n\n // Initialize Redis clients\n this.redis = createClient({ url: this.config.redisUrl });\n this.subscriber = createClient({ url: this.config.redisUrl });\n this.publisher = createClient({ url: this.config.redisUrl });\n\n // Initialize progress tracker\n this.progressTracker = new EnhancedProgressTracker(\n this.config.redisUrl,\n loggerConfig,\n this.config.hmacSecret\n );\n\n this.setupRedisClients();\n }\n\n /**\n * Initialize the messaging infrastructure\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n // Connect all Redis clients\n await Promise.all([\n this.redis.connect(),\n this.subscriber.connect(),\n this.publisher.connect(),\n this.progressTracker.initialize()\n ]);\n\n // Set up default subscriptions\n await this.setupDefaultSubscriptions();\n\n // Start heartbeat\n this.startHeartbeat();\n\n this.isInitialized = true;\n this.logger.info('Redis Messaging Infrastructure initialized', {\n agentId: this.agentId,\n swarmId: this.swarmId,\n redisConnected: true\n });\n\n this.emit('initialized');\n } catch (error) {\n this.logger.error('Failed to initialize Redis Messaging Infrastructure', {\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n /**\n * Send a message to specific agents or broadcast to swarm\n */\n async sendMessage(\n type: MessageType,\n payload: any,\n recipients?: string | string[],\n options: MessageOptions = {}\n ): Promise<string> {\n if (!this.isInitialized) {\n throw new Error('Messaging infrastructure not initialized');\n }\n\n const messageId = this.generateMessageId();\n const message: BaseMessage = {\n id: messageId,\n type,\n from: this.agentId,\n to: recipients,\n swarmId: this.swarmId,\n timestamp: Date.now(),\n payload,\n priority: options.priority || 'normal',\n signature: undefined,\n metadata: {\n retryCount: 0,\n maxRetries: options.maxRetries || 3,\n timeout: options.timeout || 30000,\n correlationId: this.generateCorrelationId(),\n expiresAt: Date.now() + (options.timeout || 30000)\n }\n };\n\n // Validate message\n await this.validateMessage(message);\n\n // Add signature\n message.signature = this.generateMessageSignature(message);\n\n // Store message for potential retries\n if (options.persistent !== false) {\n await this.storeMessage(message);\n }\n\n // Send message\n await this.publishMessage(message);\n\n this.logger.debug('Message sent', {\n messageId,\n type,\n recipients: recipients || 'broadcast',\n priority: message.priority\n });\n\n return messageId;\n }\n\n /**\n * Send task assignment to specific agent\n */\n async sendTaskAssignment(\n agentId: string,\n taskId: string,\n taskType: string,\n taskDescription: string,\n requirements?: string[],\n dependencies?: string[],\n deadline?: number\n ): Promise<string> {\n return await this.sendMessage('task_assignment', {\n taskId,\n taskType,\n taskDescription,\n requirements,\n dependencies,\n deadline,\n priority: this.calculateTaskPriority(taskType, requirements)\n }, agentId, { priority: 'high', persistent: true });\n }\n\n /**\n * Send coordination request to agent\n */\n async sendCoordinationRequest(\n targetAgentId: string,\n action: CoordinationMessage['payload']['action'],\n targetTask?: string,\n reason?: string,\n data?: any\n ): Promise<string> {\n return await this.sendMessage('coordination_request', {\n action,\n targetTask,\n reason,\n data\n }, targetAgentId, { priority: 'high' });\n }\n\n /**\n * Send coordination response\n */\n async sendCoordinationResponse(\n targetAgentId: string,\n action: CoordinationMessage['payload']['action'],\n originalMessageId: string,\n reason?: string,\n data?: any\n ): Promise<string> {\n return await this.sendMessage('coordination_response', {\n action,\n originalMessageId,\n reason,\n data\n }, targetAgentId, { priority: 'high' });\n }\n\n /**\n * Subscribe to messages from specific agents or message types\n */\n async subscribe(\n filter: {\n fromAgents?: string[];\n messageTypes?: MessageType[];\n priority?: ('low' | 'normal' | 'high' | 'critical')[];\n },\n callback: (message: BaseMessage) => void | Promise<void>\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n \n if (!this.subscriptions.has(subscriptionKey)) {\n this.subscriptions.set(subscriptionKey, new Set());\n }\n \n this.subscriptions.get(subscriptionKey)!.add(callback);\n\n // Subscribe to relevant Redis channels\n const channels = this.getChannelsForFilter(filter);\n for (const channel of channels) {\n await this.subscriber.subscribe(channel, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n \n // Apply filter\n if (!this.matchesFilter(parsedMessage, filter)) return;\n \n // Validate signature\n if (!this.validateMessageSignature(parsedMessage)) {\n this.logger.warn('Invalid message signature received', {\n messageId: parsedMessage.id,\n from: parsedMessage.from\n });\n return;\n }\n \n // Check expiration\n if (parsedMessage.metadata?.expiresAt && Date.now() > parsedMessage.metadata.expiresAt) {\n this.logger.debug('Expired message ignored', {\n messageId: parsedMessage.id\n });\n return;\n }\n \n await callback(parsedMessage);\n } catch (error) {\n this.logger.error('Error processing subscribed message', {\n error: error instanceof Error ? error.message : String(error),\n channel\n });\n }\n });\n }\n\n this.logger.debug('Subscribed to messages', { filter });\n }\n\n /**\n * Unsubscribe from messages\n */\n async unsubscribe(\n filter: Record<string, string[]>,\n callback?: (message: BaseMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n const subscriptions = this.subscriptions.get(subscriptionKey);\n \n if (subscriptions) {\n if (callback) {\n subscriptions.delete(callback);\n } else {\n subscriptions.clear();\n }\n \n if (subscriptions.size === 0) {\n this.subscriptions.delete(subscriptionKey);\n }\n }\n }\n\n /**\n * Get progress tracker instance\n */\n getProgressTracker(): EnhancedProgressTracker {\n return this.progressTracker;\n }\n\n /**\n * Get agent visibility information\n */\n async getAgentVisibility(agentId?: string): Promise<AgentVisibility | null> {\n if (agentId) {\n return await this.progressTracker.getAgentVisibility(agentId);\n }\n \n // Return current agent's visibility\n return await this.progressTracker.getAgentVisibility(this.agentId);\n }\n\n /**\n * Get swarm progress overview\n */\n async getSwarmOverview(): Promise<SwarmProgressOverview | null> {\n return await this.progressTracker.getSwarmOverview(this.swarmId);\n }\n\n /**\n * Update current agent's visibility\n */\n async updateAgentVisibility(updates: Partial<AgentVisibility>): Promise<void> {\n await this.progressTracker.updateAgentVisibility(this.agentId, updates);\n }\n\n /**\n * Broadcast agent status to swarm\n */\n async broadcastStatus(status: AgentVisibility['status'], details?: any): Promise<void> {\n await this.sendMessage('agent_status', {\n status,\n details,\n timestamp: Date.now()\n }, undefined, { priority: 'normal' });\n\n await this.updateAgentVisibility({ status });\n }\n\n /**\n * Get message history for agent or swarm\n */\n async getMessageHistory(\n filter: {\n agentId?: string;\n messageTypes?: MessageType[];\n timeRange?: { start: number; end: number };\n limit?: number;\n }\n ): Promise<BaseMessage[]> {\n const pattern = filter.agentId \n ? `messages:${this.swarmId}:${filter.agentId}:*`\n : `messages:${this.swarmId}:*`;\n \n const keys = await this.redis.keys(pattern);\n const messages: BaseMessage[] = [];\n\n for (const key of keys.slice(0, filter.limit || 100)) {\n const messageData = await this.redis.get(key);\n if (messageData) {\n const message: BaseMessage = JSON.parse(messageData);\n \n // Apply filters\n if (filter.messageTypes && !filter.messageTypes.includes(message.type)) continue;\n if (filter.timeRange) {\n if (message.timestamp < filter.timeRange.start || message.timestamp > filter.timeRange.end) continue;\n }\n \n messages.push(message);\n }\n }\n\n return messages.sort((a, b) => b.timestamp - a.timestamp);\n }\n\n /**\n * Cleanup resources and shutdown\n */\n async cleanup(): Promise<void> {\n try {\n // Stop heartbeat\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n // Send shutdown message\n if (this.isInitialized) {\n await this.sendMessage('shutdown', {\n reason: 'Agent shutdown',\n timestamp: Date.now()\n }, undefined, { priority: 'normal' });\n }\n\n // Cleanup resources\n await Promise.all([\n this.progressTracker.cleanup(),\n this.redis.quit(),\n this.subscriber.quit(),\n this.publisher.quit()\n ]);\n\n this.subscriptions.clear();\n this.messageQueue.clear();\n this.rateLimitMap.clear();\n this.isInitialized = false;\n\n this.logger.info('Redis Messaging Infrastructure cleaned up');\n } catch (error) {\n this.logger.error('Error during cleanup', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n // ===== PRIVATE METHODS =====\n\n private setupRedisClients(): void {\n const setupClient = (client: RedisClientType, name: string) => {\n client.on('error', (err) => {\n this.logger.error(`${name} client error`, { error: err.message });\n });\n\n client.on('connect', () => {\n this.logger.debug(`${name} client connected`);\n });\n\n client.on('disconnect', () => {\n this.logger.warn(`${name} client disconnected`);\n });\n };\n\n setupClient(this.redis, 'Main Redis');\n setupClient(this.subscriber, 'Redis Subscriber');\n setupClient(this.publisher, 'Redis Publisher');\n }\n\n private async setupDefaultSubscriptions(): Promise<void> {\n // Subscribe to agent-specific messages\n await this.subscriber.subscribe(`agent:${this.agentId}:messages`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n await this.handleIncomingMessage(parsedMessage);\n } catch (error) {\n this.logger.error('Error handling agent message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n\n // Subscribe to swarm-wide messages\n await this.subscriber.subscribe(`swarm:${this.swarmId}:broadcast`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n if (parsedMessage.to === undefined || parsedMessage.to === this.agentId) {\n await this.handleIncomingMessage(parsedMessage);\n }\n } catch (error) {\n this.logger.error('Error handling broadcast message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n\n // Subscribe to coordination messages\n await this.subscriber.subscribe(`swarm:${this.swarmId}:coordination`, async (message) => {\n try {\n const parsedMessage: BaseMessage = JSON.parse(message);\n if (parsedMessage.type === 'coordination_request' || parsedMessage.type === 'coordination_response') {\n await this.handleIncomingMessage(parsedMessage);\n }\n } catch (error) {\n this.logger.error('Error handling coordination message', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n }\n\n private async handleIncomingMessage(message: BaseMessage): Promise<void> {\n // Update agent activity\n await this.updateAgentActivity(message.from);\n\n // Emit message event\n this.emit('message', message);\n\n // Handle specific message types\n switch (message.type) {\n case 'task_assignment':\n this.emit('task-assigned', message);\n break;\n case 'coordination_request':\n this.emit('coordination-request', message);\n break;\n case 'coordination_response':\n this.emit('coordination-response', message);\n break;\n case 'heartbeat':\n this.emit('heartbeat', message);\n break;\n case 'shutdown':\n this.emit('agent-shutdown', message);\n break;\n }\n }\n\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(async () => {\n try {\n const heartbeat: HeartbeatMessage = {\n id: this.generateMessageId(),\n type: 'heartbeat',\n from: this.agentId,\n swarmId: this.swarmId,\n timestamp: Date.now(),\n payload: {\n status: 'healthy',\n load: await this.getCurrentLoad(),\n memoryUsage: process.memoryUsage().heapUsed / 1024 / 1024, // MB\n cpuUsage: 0, // Would need to implement CPU monitoring\n activeTasks: (await this.progressTracker.getActiveTasks(this.agentId)).length,\n lastActivity: Date.now()\n },\n priority: 'low'\n };\n\n await this.publisher.publish(\n `swarm:${this.swarmId}:heartbeat`,\n JSON.stringify(heartbeat)\n );\n } catch (error) {\n this.logger.error('Error sending heartbeat', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }, this.config.heartbeatInterval);\n }\n\n private async validateMessage(message: BaseMessage): Promise<void> {\n // Size validation\n const messageSize = JSON.stringify(message).length;\n if (messageSize > this.config.maxMessageSize) {\n throw new Error(`Message size ${messageSize} exceeds maximum ${this.config.maxMessageSize}`);\n }\n\n // Rate limiting\n const key = `${message.from}:${Math.floor(Date.now() / 1000)}`;\n const requests = this.rateLimitMap.get(key) || [];\n requests.push(Date.now());\n \n if (requests.length > this.config.rateLimitPerSecond) {\n throw new Error(`Rate limit exceeded for agent ${message.from}`);\n }\n \n this.rateLimitMap.set(key, requests);\n \n // Cleanup old rate limit entries\n setTimeout(() => {\n this.rateLimitMap.delete(key);\n }, 5000);\n }\n\n private generateMessageSignature(message: BaseMessage): string {\n const crypto = require('crypto');\n const payload = JSON.stringify({\n id: message.id,\n type: message.type,\n from: message.from,\n swarmId: message.swarmId,\n timestamp: message.timestamp\n });\n \n return crypto.createHmac('sha256', this.config.hmacSecret)\n .update(payload)\n .digest('hex');\n }\n\n private validateMessageSignature(message: BaseMessage): boolean {\n if (!message.signature) return false;\n \n const expectedSignature = this.generateMessageSignature(message);\n return message.signature === expectedSignature;\n }\n\n private async storeMessage(message: BaseMessage): Promise<void> {\n const key = `messages:${message.swarmId}:${message.from}:${message.id}`;\n await this.redis.setEx(\n key,\n Math.ceil(this.config.messageRetention / 1000),\n JSON.stringify(message)\n );\n }\n\n private async publishMessage(message: BaseMessage): Promise<void> {\n const messageData = JSON.stringify(message);\n\n if (message.to) {\n // Send to specific agents\n const recipients = Array.isArray(message.to) ? message.to : [message.to];\n for (const recipient of recipients) {\n await this.publisher.publish(`agent:${recipient}:messages`, messageData);\n }\n } else {\n // Broadcast to swarm\n await this.publisher.publish(`swarm:${message.swarmId}:broadcast`, messageData);\n }\n\n // Also publish to coordination channel if relevant\n if (['coordination_request', 'coordination_response'].includes(message.type)) {\n await this.publisher.publish(`swarm:${message.swarmId}:coordination`, messageData);\n }\n }\n\n private getChannelsForFilter(filter: Record<string, string[]>): string[] {\n const channels: string[] = [];\n\n if (filter.fromAgents) {\n // Subscribe to specific agent channels\n for (const agentId of filter.fromAgents) {\n channels.push(`agent:${agentId}:messages`);\n }\n } else {\n // Subscribe to all agent and swarm channels\n channels.push(`agent:${this.agentId}:messages`);\n channels.push(`swarm:${this.swarmId}:broadcast`);\n channels.push(`swarm:${this.swarmId}:coordination`);\n }\n\n return channels;\n }\n\n private matchesFilter(message: BaseMessage, filter: Record<string, string[]>): boolean {\n if (filter.fromAgents && !filter.fromAgents.includes(message.from)) return false;\n if (filter.messageTypes && !filter.messageTypes.includes(message.type)) return false;\n if (filter.priority && !filter.priority.includes(message.priority)) return false;\n \n return true;\n }\n\n private generateMessageId(): string {\n return `msg-${this.agentId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private generateCorrelationId(): string {\n return `corr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private calculateTaskPriority(taskType: string, requirements?: string[]): number {\n // Simple priority calculation based on task type and requirements\n const basePriority = {\n 'critical': 10,\n 'urgent': 8,\n 'high': 6,\n 'normal': 4,\n 'low': 2\n }[taskType.toLowerCase()] || 4;\n\n const requirementBonus = (requirements?.length || 0) * 0.5;\n return Math.min(10, basePriority + requirementBonus);\n }\n\n private async getCurrentLoad(): Promise<number> {\n const activeTasks = await this.progressTracker.getActiveTasks(this.agentId);\n return activeTasks.length / 5; // Normalize to 0-1 range (assuming max 5 concurrent tasks)\n }\n\n private async updateAgentActivity(agentId: string): Promise<void> {\n const key = `agent:activity:${agentId}`;\n await this.redis.setEx(key, 300, Date.now().toString()); // 5 minutes TTL\n }\n}\n\n// ===== FACTORY FUNCTION =====\n\nexport function createRedisMessagingInfrastructure(\n agentId: string,\n swarmId: string,\n config?: MessagingConfig,\n loggerConfig?: LoggingConfig\n): RedisMessagingInfrastructure {\n return new RedisMessagingInfrastructure(agentId, swarmId, config, loggerConfig);\n}\n\n// ===== EXPORTS =====\n\nexport default RedisMessagingInfrastructure;"],"names":["EventEmitter","createClient","Logger","EnhancedProgressTracker","RedisMessagingInfrastructure","redis","subscriber","publisher","logger","progressTracker","config","agentId","swarmId","isInitialized","subscriptions","Map","heartbeatInterval","messageQueue","rateLimitMap","loggerConfig","redisUrl","process","env","CFN_REDIS_URL","REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","hmacSecret","HMAC_SECRET","messageRetention","maxMessageSize","rateLimitPerSecond","enableEncryption","logConfig","level","CLAUDE_FLOW_ENV","format","destination","component","url","setupRedisClients","initialize","Promise","all","connect","setupDefaultSubscriptions","startHeartbeat","info","redisConnected","emit","error","Error","message","String","sendMessage","type","payload","recipients","options","messageId","generateMessageId","id","from","to","timestamp","Date","now","priority","signature","undefined","metadata","retryCount","maxRetries","timeout","correlationId","generateCorrelationId","expiresAt","validateMessage","generateMessageSignature","persistent","storeMessage","publishMessage","debug","sendTaskAssignment","taskId","taskType","taskDescription","requirements","dependencies","deadline","calculateTaskPriority","sendCoordinationRequest","targetAgentId","action","targetTask","reason","data","sendCoordinationResponse","originalMessageId","subscribe","filter","callback","subscriptionKey","JSON","stringify","has","set","Set","get","add","channels","getChannelsForFilter","channel","parsedMessage","parse","matchesFilter","validateMessageSignature","warn","unsubscribe","delete","clear","size","getProgressTracker","getAgentVisibility","getSwarmOverview","updateAgentVisibility","updates","broadcastStatus","status","details","getMessageHistory","pattern","keys","messages","key","slice","limit","messageData","messageTypes","includes","timeRange","start","end","push","sort","a","b","cleanup","clearInterval","quit","setupClient","client","name","on","err","handleIncomingMessage","updateAgentActivity","setInterval","heartbeat","load","getCurrentLoad","memoryUsage","heapUsed","cpuUsage","activeTasks","getActiveTasks","length","lastActivity","publish","messageSize","Math","floor","requests","setTimeout","crypto","require","createHmac","update","digest","expectedSignature","setEx","ceil","Array","isArray","recipient","fromAgents","random","toString","substr","basePriority","toLowerCase","requirementBonus","min","createRedisMessagingInfrastructure"],"mappings":"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"}
@@ -9,7 +9,7 @@ let MCPAuthMiddleware = class MCPAuthMiddleware {
9
9
  constructor(options = {}){
10
10
  this.redis = null;
11
11
  this.options = {
12
- redisUrl: options.redisUrl || 'redis://localhost:6379',
12
+ redisUrl: options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,
13
13
  tokenExpiry: options.tokenExpiry || '24h',
14
14
  authRequired: options.authRequired !== false,
15
15
  rateLimitWindow: options.rateLimitWindow || 60,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/auth-middleware.js"],"sourcesContent":["/**\r\n * MCP Authentication Middleware\r\n * Token-based authentication and authorization for MCP containers\r\n */\r\n\r\nconst crypto = require('crypto');\r\nconst Redis = require('redis');\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\n\r\nclass MCPAuthMiddleware {\r\n constructor(options = {}) {\r\n this.redis = null;\r\n this.options = {\r\n redisUrl: options.redisUrl || 'redis://localhost:6379',\r\n tokenExpiry: options.tokenExpiry || '24h',\r\n authRequired: options.authRequired !== false,\r\n rateLimitWindow: options.rateLimitWindow || 60, // seconds\r\n rateLimitMax: options.rateLimitMax || 100,\r\n agentConfigPath: options.agentConfigPath || './config/agent-whitelist.json',\r\n skillConfigPath: options.skillConfigPath || './config/skill-requirements.json',\r\n ...options\r\n };\r\n\r\n this.agentWhitelist = new Map();\r\n this.skillRequirements = new Map();\r\n this.rateLimitCache = new Map();\r\n }\r\n\r\n /**\r\n * Initialize authentication middleware\r\n */\r\n async initialize() {\r\n try {\r\n // Connect to Redis\r\n this.redis = Redis.createClient({ url: this.options.redisUrl });\r\n await this.redis.connect();\r\n\r\n console.log('[MCPAuth] Connected to Redis for authentication');\r\n\r\n // Load configuration\r\n await this.loadAgentWhitelist();\r\n await this.loadSkillRequirements();\r\n\r\n // Start cleanup interval\r\n this.startCleanupInterval();\r\n\r\n console.log('[MCPAuth] Authentication middleware initialized successfully');\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to initialize:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load agent whitelist from configuration\r\n */\r\n async loadAgentWhitelist() {\r\n try {\r\n const configPath = path.resolve(this.options.agentConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const whitelist = JSON.parse(config);\r\n\r\n this.agentWhitelist.clear();\r\n for (const agent of whitelist.agents) {\r\n this.agentWhitelist.set(agent.type, agent);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.agentWhitelist.size} agent configurations`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load agent whitelist:', error.message);\r\n // Default to empty whitelist (deny all)\r\n this.agentWhitelist.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Load skill requirements from configuration\r\n */\r\n async loadSkillRequirements() {\r\n try {\r\n const configPath = path.resolve(this.options.skillConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const requirements = JSON.parse(config);\r\n\r\n this.skillRequirements.clear();\r\n for (const [tool, req] of Object.entries(requirements.tools)) {\r\n this.skillRequirements.set(tool, req);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.skillRequirements.size} tool skill requirements`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load skill requirements:', error.message);\r\n this.skillRequirements.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate agent request\r\n */\r\n async authenticateRequest(request, response, next) {\r\n try {\r\n // Skip authentication if not required\r\n if (!this.options.authRequired) {\r\n return next();\r\n }\r\n\r\n // Extract authentication headers\r\n const agentToken = request.headers['x-agent-token'];\r\n const agentType = request.headers['x-agent-type'];\r\n const toolName = request.body?.name || request.params?.toolName;\r\n\r\n // Validate required headers\r\n if (!agentToken || !agentType) {\r\n return this.sendErrorResponse(response, 401, 'Missing authentication headers', {\r\n required: ['x-agent-token', 'x-agent-type']\r\n });\r\n }\r\n\r\n // Validate token in Redis\r\n const tokenData = await this.validateToken(agentToken, agentType);\r\n if (!tokenData) {\r\n return this.sendErrorResponse(response, 401, 'Invalid or expired token', {\r\n agentType,\r\n tokenValid: false\r\n });\r\n }\r\n\r\n // Validate agent type against whitelist\r\n if (!this.isAgentAuthorized(agentType)) {\r\n return this.sendErrorResponse(response, 403, 'Agent type not authorized', {\r\n agentType,\r\n allowedTypes: Array.from(this.agentWhitelist.keys())\r\n });\r\n }\r\n\r\n // Validate skill-based tool access\r\n if (toolName && !this.authorizeToolAccess(agentType, toolName)) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n return this.sendErrorResponse(response, 403, 'Insufficient skills for tool access', {\r\n agentType,\r\n toolName,\r\n requiredSkills: toolRequirements?.requiredSkills || [],\r\n agentSkills: tokenData.skills || []\r\n });\r\n }\r\n\r\n // Check rate limits\r\n if (!this.checkRateLimit(agentType, agentToken)) {\r\n return this.sendErrorResponse(response, 429, 'Rate limit exceeded', {\r\n agentType,\r\n window: this.options.rateLimitWindow,\r\n maxRequests: this.options.rateLimitMax\r\n });\r\n }\r\n\r\n // Add agent context to request\r\n request.agentContext = {\r\n agentType,\r\n agentToken,\r\n skills: tokenData.skills || [],\r\n authenticated: true,\r\n timestamp: Date.now()\r\n };\r\n\r\n // Update last activity\r\n await this.updateAgentActivity(agentToken, agentType);\r\n\r\n return next();\r\n\r\n } catch (error) {\r\n console.error('[MCPAuth] Authentication error:', error);\r\n return this.sendErrorResponse(response, 500, 'Authentication error', {\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Validate token against Redis\r\n */\r\n async validateToken(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const tokenData = await this.redis.get(key);\r\n\r\n if (!tokenData) {\r\n return null;\r\n }\r\n\r\n const data = JSON.parse(tokenData);\r\n\r\n // Check expiration\r\n if (Date.now() > data.expiresAt) {\r\n await this.redis.del(key);\r\n return null;\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n console.error('[MCPAuth] Token validation error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if agent type is authorized\r\n */\r\n isAgentAuthorized(agentType) {\r\n return this.agentWhitelist.has(agentType);\r\n }\r\n\r\n /**\r\n * Authorize tool access based on skills\r\n */\r\n authorizeToolAccess(agentType, toolName) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n if (!toolRequirements) {\r\n // No skill requirements defined - allow access\r\n return true;\r\n }\r\n\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n return false;\r\n }\r\n\r\n const requiredSkills = toolRequirements.requiredSkills || [];\r\n const agentSkills = agentConfig.skills || [];\r\n\r\n // Check if agent has all required skills\r\n return requiredSkills.every(skill => agentSkills.includes(skill));\r\n }\r\n\r\n /**\r\n * Check rate limits for agent\r\n */\r\n checkRateLimit(agentType, token) {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n const key = `${agentType}:${token}`;\r\n\r\n if (!this.rateLimitCache.has(key)) {\r\n this.rateLimitCache.set(key, []);\r\n }\r\n\r\n const requests = this.rateLimitCache.get(key);\r\n\r\n // Remove old requests outside window\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n this.rateLimitCache.set(key, validRequests);\r\n\r\n // Check if under limit\r\n if (validRequests.length >= this.options.rateLimitMax) {\r\n return false;\r\n }\r\n\r\n // Add current request\r\n validRequests.push(now);\r\n return true;\r\n }\r\n\r\n /**\r\n * Update agent activity in Redis\r\n */\r\n async updateAgentActivity(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const activity = {\r\n lastActivity: Date.now(),\r\n requestCount: 1\r\n };\r\n\r\n await this.redis.hIncrBy(key, 'requestCount', 1);\r\n await this.redis.hSet(key, 'lastActivity', Date.now().toString());\r\n await this.redis.expire(key, this.parseExpiry(this.options.tokenExpiry));\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to update activity:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Generate agent token\r\n */\r\n generateAgentToken(agentType, skills = [], expiresIn = null) {\r\n const token = crypto.randomBytes(32).toString('hex');\r\n const expiresAt = Date.now() + (this.parseExpiry(expiresIn || this.options.tokenExpiry) * 1000);\r\n\r\n return {\r\n token,\r\n agentType,\r\n skills,\r\n expiresAt,\r\n createdAt: Date.now()\r\n };\r\n }\r\n\r\n /**\r\n * Register agent token in Redis\r\n */\r\n async registerAgentToken(tokenData) {\r\n try {\r\n const key = `mcp:agent:${tokenData.agentType}:${tokenData.token}`;\r\n const value = JSON.stringify(tokenData);\r\n\r\n await this.redis.setEx(key, this.parseExpiry(this.options.tokenExpiry), value);\r\n\r\n console.log(`[MCPAuth] Registered token for agent: ${tokenData.agentType}`);\r\n return tokenData;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to register token:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Revoke agent token\r\n */\r\n async revokeAgentToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n await this.redis.del(key);\r\n\r\n console.log(`[MCPAuth] Revoked token for agent: ${agentType}`);\r\n return true;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to revoke token:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Send error response\r\n */\r\n sendErrorResponse(response, statusCode, message, details = null) {\r\n const errorResponse = {\r\n jsonrpc: '2.0',\r\n error: {\r\n code: statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32003,\r\n message,\r\n ...(details && { details })\r\n },\r\n id: response.body?.id || null\r\n };\r\n\r\n response.writeHead(statusCode, { 'Content-Type': 'application/json' });\r\n response.end(JSON.stringify(errorResponse));\r\n }\r\n\r\n /**\r\n * Parse expiry string to seconds\r\n */\r\n parseExpiry(expiry) {\r\n if (typeof expiry === 'number') {\r\n return expiry;\r\n }\r\n\r\n const match = expiry.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n return 3600; // Default to 1 hour\r\n }\r\n\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };\r\n\r\n return value * (multipliers[unit] || 3600);\r\n }\r\n\r\n /**\r\n * Start cleanup interval for rate limit cache\r\n */\r\n startCleanupInterval() {\r\n setInterval(() => {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n\r\n for (const [key, requests] of this.rateLimitCache.entries()) {\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n if (validRequests.length === 0) {\r\n this.rateLimitCache.delete(key);\r\n } else {\r\n this.rateLimitCache.set(key, validRequests);\r\n }\r\n }\r\n }, 60000); // Clean up every minute\r\n }\r\n\r\n /**\r\n * Get authentication statistics\r\n */\r\n async getStats() {\r\n try {\r\n const stats = {\r\n registeredAgents: this.agentWhitelist.size,\r\n configuredTools: this.skillRequirements.size,\r\n rateLimitedClients: this.rateLimitCache.size,\r\n redisConnected: this.redis?.isOpen || false\r\n };\r\n\r\n // Get active tokens count\r\n if (this.redis?.isOpen) {\r\n const keys = await this.redis.keys('mcp:agent:*');\r\n stats.activeTokens = keys.length;\r\n }\r\n\r\n return stats;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to get stats:', error);\r\n return { error: error.message };\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown authentication middleware\r\n */\r\n async shutdown() {\r\n try {\r\n if (this.redis) {\r\n await this.redis.quit();\r\n this.redis = null;\r\n }\r\n console.log('[MCPAuth] Authentication middleware shutdown complete');\r\n } catch (error) {\r\n console.error('[MCPAuth] Shutdown error:', error);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = MCPAuthMiddleware;"],"names":["crypto","require","Redis","fs","promises","path","MCPAuthMiddleware","options","redis","redisUrl","tokenExpiry","authRequired","rateLimitWindow","rateLimitMax","agentConfigPath","skillConfigPath","agentWhitelist","Map","skillRequirements","rateLimitCache","initialize","createClient","url","connect","console","log","loadAgentWhitelist","loadSkillRequirements","startCleanupInterval","error","configPath","resolve","config","readFile","whitelist","JSON","parse","clear","agent","agents","set","type","size","warn","message","requirements","tool","req","Object","entries","tools","authenticateRequest","request","response","next","agentToken","headers","agentType","toolName","body","name","params","sendErrorResponse","required","tokenData","validateToken","tokenValid","isAgentAuthorized","allowedTypes","Array","from","keys","authorizeToolAccess","toolRequirements","get","requiredSkills","agentSkills","skills","checkRateLimit","window","maxRequests","agentContext","authenticated","timestamp","Date","now","updateAgentActivity","token","key","data","expiresAt","del","has","agentConfig","every","skill","includes","windowStart","requests","validRequests","filter","length","push","activity","lastActivity","requestCount","hIncrBy","hSet","toString","expire","parseExpiry","generateAgentToken","expiresIn","randomBytes","createdAt","registerAgentToken","value","stringify","setEx","revokeAgentToken","statusCode","details","errorResponse","jsonrpc","code","id","writeHead","end","expiry","match","parseInt","unit","multipliers","s","m","h","d","setInterval","delete","getStats","stats","registeredAgents","configuredTools","rateLimitedClients","redisConnected","isOpen","activeTokens","shutdown","quit","module","exports"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/mcp/auth-middleware.js"],"sourcesContent":["/**\r\n * MCP Authentication Middleware\r\n * Token-based authentication and authorization for MCP containers\r\n */\r\n\r\nconst crypto = require('crypto');\r\nconst Redis = require('redis');\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\n\r\nclass MCPAuthMiddleware {\r\n constructor(options = {}) {\r\n this.redis = null;\r\n this.options = {\r\n redisUrl: options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,\r\n tokenExpiry: options.tokenExpiry || '24h',\r\n authRequired: options.authRequired !== false,\r\n rateLimitWindow: options.rateLimitWindow || 60, // seconds\r\n rateLimitMax: options.rateLimitMax || 100,\r\n agentConfigPath: options.agentConfigPath || './config/agent-whitelist.json',\r\n skillConfigPath: options.skillConfigPath || './config/skill-requirements.json',\r\n ...options\r\n };\r\n\r\n this.agentWhitelist = new Map();\r\n this.skillRequirements = new Map();\r\n this.rateLimitCache = new Map();\r\n }\r\n\r\n /**\r\n * Initialize authentication middleware\r\n */\r\n async initialize() {\r\n try {\r\n // Connect to Redis\r\n this.redis = Redis.createClient({ url: this.options.redisUrl });\r\n await this.redis.connect();\r\n\r\n console.log('[MCPAuth] Connected to Redis for authentication');\r\n\r\n // Load configuration\r\n await this.loadAgentWhitelist();\r\n await this.loadSkillRequirements();\r\n\r\n // Start cleanup interval\r\n this.startCleanupInterval();\r\n\r\n console.log('[MCPAuth] Authentication middleware initialized successfully');\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to initialize:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load agent whitelist from configuration\r\n */\r\n async loadAgentWhitelist() {\r\n try {\r\n const configPath = path.resolve(this.options.agentConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const whitelist = JSON.parse(config);\r\n\r\n this.agentWhitelist.clear();\r\n for (const agent of whitelist.agents) {\r\n this.agentWhitelist.set(agent.type, agent);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.agentWhitelist.size} agent configurations`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load agent whitelist:', error.message);\r\n // Default to empty whitelist (deny all)\r\n this.agentWhitelist.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Load skill requirements from configuration\r\n */\r\n async loadSkillRequirements() {\r\n try {\r\n const configPath = path.resolve(this.options.skillConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const requirements = JSON.parse(config);\r\n\r\n this.skillRequirements.clear();\r\n for (const [tool, req] of Object.entries(requirements.tools)) {\r\n this.skillRequirements.set(tool, req);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.skillRequirements.size} tool skill requirements`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load skill requirements:', error.message);\r\n this.skillRequirements.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate agent request\r\n */\r\n async authenticateRequest(request, response, next) {\r\n try {\r\n // Skip authentication if not required\r\n if (!this.options.authRequired) {\r\n return next();\r\n }\r\n\r\n // Extract authentication headers\r\n const agentToken = request.headers['x-agent-token'];\r\n const agentType = request.headers['x-agent-type'];\r\n const toolName = request.body?.name || request.params?.toolName;\r\n\r\n // Validate required headers\r\n if (!agentToken || !agentType) {\r\n return this.sendErrorResponse(response, 401, 'Missing authentication headers', {\r\n required: ['x-agent-token', 'x-agent-type']\r\n });\r\n }\r\n\r\n // Validate token in Redis\r\n const tokenData = await this.validateToken(agentToken, agentType);\r\n if (!tokenData) {\r\n return this.sendErrorResponse(response, 401, 'Invalid or expired token', {\r\n agentType,\r\n tokenValid: false\r\n });\r\n }\r\n\r\n // Validate agent type against whitelist\r\n if (!this.isAgentAuthorized(agentType)) {\r\n return this.sendErrorResponse(response, 403, 'Agent type not authorized', {\r\n agentType,\r\n allowedTypes: Array.from(this.agentWhitelist.keys())\r\n });\r\n }\r\n\r\n // Validate skill-based tool access\r\n if (toolName && !this.authorizeToolAccess(agentType, toolName)) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n return this.sendErrorResponse(response, 403, 'Insufficient skills for tool access', {\r\n agentType,\r\n toolName,\r\n requiredSkills: toolRequirements?.requiredSkills || [],\r\n agentSkills: tokenData.skills || []\r\n });\r\n }\r\n\r\n // Check rate limits\r\n if (!this.checkRateLimit(agentType, agentToken)) {\r\n return this.sendErrorResponse(response, 429, 'Rate limit exceeded', {\r\n agentType,\r\n window: this.options.rateLimitWindow,\r\n maxRequests: this.options.rateLimitMax\r\n });\r\n }\r\n\r\n // Add agent context to request\r\n request.agentContext = {\r\n agentType,\r\n agentToken,\r\n skills: tokenData.skills || [],\r\n authenticated: true,\r\n timestamp: Date.now()\r\n };\r\n\r\n // Update last activity\r\n await this.updateAgentActivity(agentToken, agentType);\r\n\r\n return next();\r\n\r\n } catch (error) {\r\n console.error('[MCPAuth] Authentication error:', error);\r\n return this.sendErrorResponse(response, 500, 'Authentication error', {\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Validate token against Redis\r\n */\r\n async validateToken(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const tokenData = await this.redis.get(key);\r\n\r\n if (!tokenData) {\r\n return null;\r\n }\r\n\r\n const data = JSON.parse(tokenData);\r\n\r\n // Check expiration\r\n if (Date.now() > data.expiresAt) {\r\n await this.redis.del(key);\r\n return null;\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n console.error('[MCPAuth] Token validation error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if agent type is authorized\r\n */\r\n isAgentAuthorized(agentType) {\r\n return this.agentWhitelist.has(agentType);\r\n }\r\n\r\n /**\r\n * Authorize tool access based on skills\r\n */\r\n authorizeToolAccess(agentType, toolName) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n if (!toolRequirements) {\r\n // No skill requirements defined - allow access\r\n return true;\r\n }\r\n\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n return false;\r\n }\r\n\r\n const requiredSkills = toolRequirements.requiredSkills || [];\r\n const agentSkills = agentConfig.skills || [];\r\n\r\n // Check if agent has all required skills\r\n return requiredSkills.every(skill => agentSkills.includes(skill));\r\n }\r\n\r\n /**\r\n * Check rate limits for agent\r\n */\r\n checkRateLimit(agentType, token) {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n const key = `${agentType}:${token}`;\r\n\r\n if (!this.rateLimitCache.has(key)) {\r\n this.rateLimitCache.set(key, []);\r\n }\r\n\r\n const requests = this.rateLimitCache.get(key);\r\n\r\n // Remove old requests outside window\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n this.rateLimitCache.set(key, validRequests);\r\n\r\n // Check if under limit\r\n if (validRequests.length >= this.options.rateLimitMax) {\r\n return false;\r\n }\r\n\r\n // Add current request\r\n validRequests.push(now);\r\n return true;\r\n }\r\n\r\n /**\r\n * Update agent activity in Redis\r\n */\r\n async updateAgentActivity(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const activity = {\r\n lastActivity: Date.now(),\r\n requestCount: 1\r\n };\r\n\r\n await this.redis.hIncrBy(key, 'requestCount', 1);\r\n await this.redis.hSet(key, 'lastActivity', Date.now().toString());\r\n await this.redis.expire(key, this.parseExpiry(this.options.tokenExpiry));\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to update activity:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Generate agent token\r\n */\r\n generateAgentToken(agentType, skills = [], expiresIn = null) {\r\n const token = crypto.randomBytes(32).toString('hex');\r\n const expiresAt = Date.now() + (this.parseExpiry(expiresIn || this.options.tokenExpiry) * 1000);\r\n\r\n return {\r\n token,\r\n agentType,\r\n skills,\r\n expiresAt,\r\n createdAt: Date.now()\r\n };\r\n }\r\n\r\n /**\r\n * Register agent token in Redis\r\n */\r\n async registerAgentToken(tokenData) {\r\n try {\r\n const key = `mcp:agent:${tokenData.agentType}:${tokenData.token}`;\r\n const value = JSON.stringify(tokenData);\r\n\r\n await this.redis.setEx(key, this.parseExpiry(this.options.tokenExpiry), value);\r\n\r\n console.log(`[MCPAuth] Registered token for agent: ${tokenData.agentType}`);\r\n return tokenData;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to register token:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Revoke agent token\r\n */\r\n async revokeAgentToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n await this.redis.del(key);\r\n\r\n console.log(`[MCPAuth] Revoked token for agent: ${agentType}`);\r\n return true;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to revoke token:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Send error response\r\n */\r\n sendErrorResponse(response, statusCode, message, details = null) {\r\n const errorResponse = {\r\n jsonrpc: '2.0',\r\n error: {\r\n code: statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32003,\r\n message,\r\n ...(details && { details })\r\n },\r\n id: response.body?.id || null\r\n };\r\n\r\n response.writeHead(statusCode, { 'Content-Type': 'application/json' });\r\n response.end(JSON.stringify(errorResponse));\r\n }\r\n\r\n /**\r\n * Parse expiry string to seconds\r\n */\r\n parseExpiry(expiry) {\r\n if (typeof expiry === 'number') {\r\n return expiry;\r\n }\r\n\r\n const match = expiry.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n return 3600; // Default to 1 hour\r\n }\r\n\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };\r\n\r\n return value * (multipliers[unit] || 3600);\r\n }\r\n\r\n /**\r\n * Start cleanup interval for rate limit cache\r\n */\r\n startCleanupInterval() {\r\n setInterval(() => {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n\r\n for (const [key, requests] of this.rateLimitCache.entries()) {\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n if (validRequests.length === 0) {\r\n this.rateLimitCache.delete(key);\r\n } else {\r\n this.rateLimitCache.set(key, validRequests);\r\n }\r\n }\r\n }, 60000); // Clean up every minute\r\n }\r\n\r\n /**\r\n * Get authentication statistics\r\n */\r\n async getStats() {\r\n try {\r\n const stats = {\r\n registeredAgents: this.agentWhitelist.size,\r\n configuredTools: this.skillRequirements.size,\r\n rateLimitedClients: this.rateLimitCache.size,\r\n redisConnected: this.redis?.isOpen || false\r\n };\r\n\r\n // Get active tokens count\r\n if (this.redis?.isOpen) {\r\n const keys = await this.redis.keys('mcp:agent:*');\r\n stats.activeTokens = keys.length;\r\n }\r\n\r\n return stats;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to get stats:', error);\r\n return { error: error.message };\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown authentication middleware\r\n */\r\n async shutdown() {\r\n try {\r\n if (this.redis) {\r\n await this.redis.quit();\r\n this.redis = null;\r\n }\r\n console.log('[MCPAuth] Authentication middleware shutdown complete');\r\n } catch (error) {\r\n console.error('[MCPAuth] Shutdown error:', error);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = MCPAuthMiddleware;"],"names":["crypto","require","Redis","fs","promises","path","MCPAuthMiddleware","options","redis","redisUrl","process","env","CFN_REDIS_URL","MCP_REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","tokenExpiry","authRequired","rateLimitWindow","rateLimitMax","agentConfigPath","skillConfigPath","agentWhitelist","Map","skillRequirements","rateLimitCache","initialize","createClient","url","connect","console","log","loadAgentWhitelist","loadSkillRequirements","startCleanupInterval","error","configPath","resolve","config","readFile","whitelist","JSON","parse","clear","agent","agents","set","type","size","warn","message","requirements","tool","req","Object","entries","tools","authenticateRequest","request","response","next","agentToken","headers","agentType","toolName","body","name","params","sendErrorResponse","required","tokenData","validateToken","tokenValid","isAgentAuthorized","allowedTypes","Array","from","keys","authorizeToolAccess","toolRequirements","get","requiredSkills","agentSkills","skills","checkRateLimit","window","maxRequests","agentContext","authenticated","timestamp","Date","now","updateAgentActivity","token","key","data","expiresAt","del","has","agentConfig","every","skill","includes","windowStart","requests","validRequests","filter","length","push","activity","lastActivity","requestCount","hIncrBy","hSet","toString","expire","parseExpiry","generateAgentToken","expiresIn","randomBytes","createdAt","registerAgentToken","value","stringify","setEx","revokeAgentToken","statusCode","details","errorResponse","jsonrpc","code","id","writeHead","end","expiry","match","parseInt","unit","multipliers","s","m","h","d","setInterval","delete","getStats","stats","registeredAgents","configuredTools","rateLimitedClients","redisConnected","isOpen","activeTokens","shutdown","quit","module","exports"],"mappings":"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"}
@@ -16,7 +16,7 @@ let AuthenticatedPlaywrightMCPServer = class AuthenticatedPlaywrightMCPServer {
16
16
  });
17
17
  // Initialize authentication middleware
18
18
  this.auth = new MCPAuthMiddleware({
19
- redisUrl: options.redisUrl || process.env.MCP_REDIS_URL || 'redis://localhost:6379',
19
+ redisUrl: options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,
20
20
  authRequired: options.authRequired !== false && process.env.MCP_AUTH_REQUIRED !== 'false',
21
21
  agentConfigPath: options.agentConfigPath || process.env.MCP_AGENT_CONFIG || './config/agent-whitelist.json',
22
22
  skillConfigPath: options.skillConfigPath || process.env.MCP_SKILL_CONFIG || './config/skill-requirements.json',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/playwright-mcp-server-auth.js"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Enhanced Playwright MCP Server with Authentication\r\n * Includes token-based authentication and authorization\r\n */\r\n\r\nconst { chromium } = require('playwright');\r\nconst readline = require('readline');\r\nconst MCPAuthMiddleware = require('./auth-middleware.js');\r\n\r\nclass AuthenticatedPlaywrightMCPServer {\r\n constructor(options = {}) {\r\n this.browser = null;\r\n this.page = null;\r\n this.rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false\r\n });\r\n\r\n // Initialize authentication middleware\r\n this.auth = new MCPAuthMiddleware({\r\n redisUrl: options.redisUrl || process.env.MCP_REDIS_URL || 'redis://localhost:6379',\r\n authRequired: options.authRequired !== false && process.env.MCP_AUTH_REQUIRED !== 'false',\r\n agentConfigPath: options.agentConfigPath || process.env.MCP_AGENT_CONFIG || './config/agent-whitelist.json',\r\n skillConfigPath: options.skillConfigPath || process.env.MCP_SKILL_CONFIG || './config/skill-requirements.json',\r\n rateLimitMax: options.rateLimitMax || parseInt(process.env.MCP_RATE_LIMIT_MAX) || 60,\r\n rateLimitWindow: options.rateLimitWindow || parseInt(process.env.MCP_RATE_LIMIT_WINDOW) || 60\r\n });\r\n\r\n this.tools = {\r\n take_screenshot: {\r\n name: 'take_screenshot',\r\n description: 'Take a screenshot of a webpage (requires browser-automation, screenshot-capture skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n url: { type: 'string', description: 'URL to capture' },\r\n filename: { type: 'string', description: 'Screenshot filename (optional)' },\r\n fullPage: { type: 'boolean', default: false, description: 'Capture full page' },\r\n waitTime: { type: 'number', default: 3000, description: 'Wait time before screenshot (ms)' }\r\n },\r\n required: ['url']\r\n },\r\n skillRequirements: ['browser-automation', 'screenshot-capture']\r\n },\r\n search_google: {\r\n name: 'search_google',\r\n description: 'Search Google and return results (requires browser-automation, web-search skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n query: { type: 'string', description: 'Search query' },\r\n screenshot: { type: 'boolean', default: true, description: 'Take screenshot of results' },\r\n resultCount: { type: 'number', default: 5, description: 'Number of results to return' }\r\n },\r\n required: ['query']\r\n },\r\n skillRequirements: ['browser-automation', 'web-search']\r\n },\r\n navigate_and_interact: {\r\n name: 'navigate_and_interact',\r\n description: 'Navigate to a webpage and interact with elements (requires browser-automation, web-interaction skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n url: { type: 'string', description: 'URL to navigate to' },\r\n actions: {\r\n type: 'array',\r\n description: 'Array of actions to perform',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n type: { type: 'string', enum: ['click', 'fill', 'press', 'wait'] },\r\n selector: { type: 'string', description: 'CSS selector' },\r\n value: { type: 'string', description: 'Value for fill actions' },\r\n key: { type: 'string', description: 'Key for press actions' }\r\n }\r\n }\r\n },\r\n screenshot: { type: 'boolean', default: false }\r\n },\r\n required: ['url']\r\n },\r\n skillRequirements: ['browser-automation', 'web-interaction']\r\n }\r\n };\r\n\r\n this.stats = {\r\n totalRequests: 0,\r\n authorizedRequests: 0,\r\n rejectedRequests: 0,\r\n toolUsage: {},\r\n lastActivity: null\r\n };\r\n }\r\n\r\n async initialize() {\r\n try {\r\n // Initialize authentication\r\n await this.auth.initialize();\r\n console.error('[MCP-Server] Authentication middleware initialized');\r\n\r\n // Initialize Playwright browser\r\n await this.initBrowser();\r\n console.error('[MCP-Server] Playwright browser initialized');\r\n\r\n console.error('[MCP-Server] Authenticated Playwright MCP Server ready');\r\n } catch (error) {\r\n console.error('[MCP-Server] Failed to initialize:', error);\r\n process.exit(1);\r\n }\r\n }\r\n\r\n async initBrowser() {\r\n if (!this.browser) {\r\n this.browser = await chromium.launch({\r\n headless: true,\r\n args: [\r\n '--no-sandbox',\r\n '--disable-setuid-sandbox',\r\n '--disable-dev-shm-usage',\r\n '--disable-gpu'\r\n ]\r\n });\r\n this.page = await this.browser.newPage();\r\n }\r\n }\r\n\r\n async takeScreenshot(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Taking screenshot for ${agentContext.agentType}`);\r\n\r\n await this.page.goto(args.url, {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n if (args.waitTime > 0) {\r\n await this.page.waitForTimeout(args.waitTime);\r\n }\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = args.filename || `screenshot-${agentContext.agentType}-${timestamp}.png`;\r\n const filepath = `/app/screenshots/${filename}`;\r\n\r\n await this.page.screenshot({\r\n path: filepath,\r\n fullPage: args.fullPage || false\r\n });\r\n\r\n return {\r\n success: true,\r\n filename: filename,\r\n filepath: filepath,\r\n url: args.url,\r\n title: await this.page.title(),\r\n size: `${this.page.viewportSize()?.width || 1280}x${this.page.viewportSize()?.height || 720}`,\r\n capturedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async searchGoogle(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Google search for ${agentContext.agentType}: \"${args.query}\"`);\r\n\r\n await this.page.goto('https://www.google.com', {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n // Handle cookies popup if present\r\n try {\r\n await this.page.waitForSelector('button[aria-label*=\"Accept\"], button[aria-label*=\"agree\"]', { timeout: 3000 });\r\n await this.page.click('button[aria-label*=\"Accept\"], button[aria-label*=\"agree\"]');\r\n await this.page.waitForTimeout(1000);\r\n } catch (e) {\r\n // No cookie popup, continue\r\n }\r\n\r\n // Perform search\r\n const searchBox = await this.page.waitForSelector('textarea[name=\"q\"], input[name=\"q\"]', { timeout: 10000 });\r\n await searchBox.fill(args.query);\r\n await searchBox.press('Enter');\r\n\r\n // Wait for results\r\n await this.page.waitForSelector('[role=\"main\"], #search', { timeout: 15000 });\r\n\r\n // Extract results\r\n const results = await this.page.$$eval('div[data-hveid] h3', elements =>\r\n elements.slice(0, args.resultCount || 5).map(el => el.textContent.trim())\r\n );\r\n\r\n let screenshotInfo = null;\r\n if (args.screenshot) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `google-search-${args.query.toLowerCase().replace(/\\s+/g, '-')}-${timestamp}.png`;\r\n await this.page.screenshot({ path: `/app/screenshots/${filename}` });\r\n screenshotInfo = {\r\n filename,\r\n path: `/app/screenshots/${filename}`,\r\n url: this.page.url()\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n query: args.query,\r\n results: results,\r\n resultCount: results.length,\r\n screenshot: screenshotInfo,\r\n url: this.page.url(),\r\n title: await this.page.title(),\r\n searchedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async navigateAndInteract(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Page interaction for ${agentContext.agentType}: ${args.url}`);\r\n\r\n await this.page.goto(args.url, {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n const results = [];\r\n\r\n for (const action of args.actions || []) {\r\n try {\r\n switch (action.type) {\r\n case 'click':\r\n await this.page.waitForSelector(action.selector, { timeout: 5000 });\r\n await this.page.click(action.selector);\r\n results.push({ action: 'click', selector: action.selector, success: true });\r\n break;\r\n\r\n case 'fill':\r\n await this.page.waitForSelector(action.selector, { timeout: 5000 });\r\n await this.page.fill(action.selector, action.value);\r\n results.push({ action: 'fill', selector: action.selector, value: action.value, success: true });\r\n break;\r\n\r\n case 'press':\r\n await this.page.press(action.selector || 'body', action.key);\r\n results.push({ action: 'press', key: action.key, success: true });\r\n break;\r\n\r\n case 'wait':\r\n await this.page.waitForTimeout(parseInt(action.value) || 1000);\r\n results.push({ action: 'wait', duration: action.value, success: true });\r\n break;\r\n }\r\n } catch (error) {\r\n results.push({\r\n action: action.type,\r\n selector: action.selector,\r\n success: false,\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n let screenshotInfo = null;\r\n if (args.screenshot) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `interaction-${agentContext.agentType}-${timestamp}.png`;\r\n await this.page.screenshot({ path: `/app/screenshots/${filename}` });\r\n screenshotInfo = {\r\n filename,\r\n path: `/app/screenshots/${filename}`\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n url: args.url,\r\n actions: results,\r\n screenshot: screenshotInfo,\r\n title: await this.page.title(),\r\n interactedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async handleMessage(message) {\r\n try {\r\n this.stats.totalRequests++;\r\n this.stats.lastActivity = Date.now();\r\n\r\n // Initialize request context\r\n const request = {\r\n headers: {\r\n 'x-agent-token': message.params?.context?.agentToken,\r\n 'x-agent-type': message.params?.context?.agentType\r\n },\r\n body: message\r\n };\r\n\r\n const response = {\r\n writeHead: () => {},\r\n end: (data) => {\r\n // For JSON-RPC, we'll just return the data directly\r\n this.responseData = JSON.parse(data);\r\n }\r\n };\r\n\r\n // Authenticate request\r\n let authenticationPassed = false;\r\n await this.auth.authenticateRequest(request, response, () => {\r\n authenticationPassed = true;\r\n });\r\n\r\n if (!authenticationPassed) {\r\n this.stats.rejectedRequests++;\r\n return this.responseData || {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n error: {\r\n code: -32001,\r\n message: 'Authentication failed'\r\n }\r\n };\r\n }\r\n\r\n this.stats.authorizedRequests++;\r\n\r\n // Authentication passed, process request\r\n if (message.method === 'initialize') {\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: {\r\n protocolVersion: '2024-11-05',\r\n capabilities: {\r\n tools: {}\r\n },\r\n serverInfo: {\r\n name: 'playwright-mcp-server-authenticated',\r\n version: '1.0.0',\r\n authentication: 'enabled'\r\n }\r\n }\r\n };\r\n } else if (message.method === 'tools/list') {\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: { tools: Object.values(this.tools) }\r\n };\r\n } else if (message.method === 'tools/call') {\r\n const toolName = message.params.name;\r\n const args = message.params.arguments || {};\r\n const agentContext = request.agentContext || {\r\n agentType: 'unknown',\r\n authenticated: false\r\n };\r\n\r\n // Update tool usage stats\r\n this.stats.toolUsage[toolName] = (this.stats.toolUsage[toolName] || 0) + 1;\r\n\r\n let result;\r\n if (toolName === 'take_screenshot') {\r\n result = await this.takeScreenshot(args, agentContext);\r\n } else if (toolName === 'search_google') {\r\n result = await this.searchGoogle(args, agentContext);\r\n } else if (toolName === 'navigate_and_interact') {\r\n result = await this.navigateAndInteract(args, agentContext);\r\n } else {\r\n throw new Error(`Unknown tool: ${toolName}`);\r\n }\r\n\r\n console.error(`[MCP-Server] Tool ${toolName} executed by ${agentContext.agentType}`);\r\n\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify(result, null, 2)\r\n }]\r\n }\r\n };\r\n }\r\n } catch (error) {\r\n console.error('[MCP-Server] Error handling message:', error);\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id || null,\r\n error: {\r\n code: -32000,\r\n message: error.message\r\n }\r\n };\r\n }\r\n }\r\n\r\n async start() {\r\n await this.initialize();\r\n\r\n this.rl.on('line', async (line) => {\r\n try {\r\n const message = JSON.parse(line);\r\n const response = await this.handleMessage(message);\r\n console.log(JSON.stringify(response));\r\n } catch (error) {\r\n console.log(JSON.stringify({\r\n jsonrpc: '2.0',\r\n id: null,\r\n error: {\r\n code: -32700,\r\n message: `Parse error: ${error.message}`\r\n }\r\n }));\r\n }\r\n });\r\n\r\n // Cleanup on exit\r\n process.on('SIGINT', async () => {\r\n console.error('[MCP-Server] Shutting down authenticated Playwright MCP Server...');\r\n await this.shutdown();\r\n process.exit(0);\r\n });\r\n\r\n // Log statistics periodically\r\n setInterval(() => {\r\n console.error(`[MCP-Server] Stats: ${this.stats.totalRequests} total, ${this.stats.authorizedRequests} authorized, ${this.stats.rejectedRequests} rejected`);\r\n console.error(`[MCP-Server] Tool usage:`, JSON.stringify(this.stats.toolUsage));\r\n }, 60000); // Every minute\r\n }\r\n\r\n async getStats() {\r\n const authStats = await this.auth.getStats();\r\n return {\r\n server: {\r\n name: 'playwright-mcp-server-authenticated',\r\n uptime: process.uptime(),\r\n ...this.stats\r\n },\r\n authentication: authStats\r\n };\r\n }\r\n\r\n async shutdown() {\r\n try {\r\n if (this.browser) await this.browser.close();\r\n if (this.rl) this.rl.close();\r\n if (this.auth) await this.auth.shutdown();\r\n console.error('[MCP-Server] Shutdown complete');\r\n } catch (error) {\r\n console.error('[MCP-Server] Error during shutdown:', error);\r\n }\r\n }\r\n}\r\n\r\n// Start the server\r\nconst server = new AuthenticatedPlaywrightMCPServer({\r\n redisUrl: process.env.MCP_REDIS_URL,\r\n authRequired: process.env.MCP_AUTH_REQUIRED !== 'false',\r\n rateLimitMax: parseInt(process.env.MCP_RATE_LIMIT_MAX) || 60\r\n});\r\n\r\nserver.start().catch(error => {\r\n console.error('[MCP-Server] Failed to start authenticated Playwright MCP Server:', error);\r\n process.exit(1);\r\n});"],"names":["chromium","require","readline","MCPAuthMiddleware","AuthenticatedPlaywrightMCPServer","options","browser","page","rl","createInterface","input","process","stdin","output","stdout","terminal","auth","redisUrl","env","MCP_REDIS_URL","authRequired","MCP_AUTH_REQUIRED","agentConfigPath","MCP_AGENT_CONFIG","skillConfigPath","MCP_SKILL_CONFIG","rateLimitMax","parseInt","MCP_RATE_LIMIT_MAX","rateLimitWindow","MCP_RATE_LIMIT_WINDOW","tools","take_screenshot","name","description","inputSchema","type","properties","url","filename","fullPage","default","waitTime","required","skillRequirements","search_google","query","screenshot","resultCount","navigate_and_interact","actions","items","enum","selector","value","key","stats","totalRequests","authorizedRequests","rejectedRequests","toolUsage","lastActivity","initialize","console","error","initBrowser","exit","launch","headless","args","newPage","takeScreenshot","agentContext","agentType","goto","waitUntil","timeout","waitForTimeout","timestamp","Date","toISOString","replace","filepath","path","success","title","size","viewportSize","width","height","capturedBy","searchGoogle","waitForSelector","click","e","searchBox","fill","press","results","$$eval","elements","slice","map","el","textContent","trim","screenshotInfo","toLowerCase","length","searchedBy","navigateAndInteract","action","push","duration","message","interactedBy","handleMessage","now","request","headers","params","context","agentToken","body","response","writeHead","end","data","responseData","JSON","parse","authenticationPassed","authenticateRequest","jsonrpc","id","code","method","result","protocolVersion","capabilities","serverInfo","version","authentication","Object","values","toolName","arguments","authenticated","Error","content","text","stringify","start","on","line","log","shutdown","setInterval","getStats","authStats","server","uptime","close","catch"],"mappings":";AAEA;;;CAGC,GAED,MAAM,EAAEA,QAAQ,EAAE,GAAGC,QAAQ;AAC7B,MAAMC,WAAWD,QAAQ;AACzB,MAAME,oBAAoBF,QAAQ;AAElC,IAAA,AAAMG,mCAAN,MAAMA;IACF,YAAYC,UAAU,CAAC,CAAC,CAAE;QACtB,IAAI,CAACC,OAAO,GAAG;QACf,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,EAAE,GAAGN,SAASO,eAAe,CAAC;YAC/BC,OAAOC,QAAQC,KAAK;YACpBC,QAAQF,QAAQG,MAAM;YACtBC,UAAU;QACd;QAEA,uCAAuC;QACvC,IAAI,CAACC,IAAI,GAAG,IAAIb,kBAAkB;YAC9Bc,UAAUZ,QAAQY,QAAQ,IAAIN,QAAQO,GAAG,CAACC,aAAa,IAAI;YAC3DC,cAAcf,QAAQe,YAAY,KAAK,SAAST,QAAQO,GAAG,CAACG,iBAAiB,KAAK;YAClFC,iBAAiBjB,QAAQiB,eAAe,IAAIX,QAAQO,GAAG,CAACK,gBAAgB,IAAI;YAC5EC,iBAAiBnB,QAAQmB,eAAe,IAAIb,QAAQO,GAAG,CAACO,gBAAgB,IAAI;YAC5EC,cAAcrB,QAAQqB,YAAY,IAAIC,SAAShB,QAAQO,GAAG,CAACU,kBAAkB,KAAK;YAClFC,iBAAiBxB,QAAQwB,eAAe,IAAIF,SAAShB,QAAQO,GAAG,CAACY,qBAAqB,KAAK;QAC/F;QAEA,IAAI,CAACC,KAAK,GAAG;YACTC,iBAAiB;gBACbC,MAAM;gBACNC,aAAa;gBACbC,aAAa;oBACTC,MAAM;oBACNC,YAAY;wBACRC,KAAK;4BAAEF,MAAM;4BAAUF,aAAa;wBAAiB;wBACrDK,UAAU;4BAAEH,MAAM;4BAAUF,aAAa;wBAAiC;wBAC1EM,UAAU;4BAAEJ,MAAM;4BAAWK,SAAS;4BAAOP,aAAa;wBAAoB;wBAC9EQ,UAAU;4BAAEN,MAAM;4BAAUK,SAAS;4BAAMP,aAAa;wBAAmC;oBAC/F;oBACAS,UAAU;wBAAC;qBAAM;gBACrB;gBACAC,mBAAmB;oBAAC;oBAAsB;iBAAqB;YACnE;YACAC,eAAe;gBACXZ,MAAM;gBACNC,aAAa;gBACbC,aAAa;oBACTC,MAAM;oBACNC,YAAY;wBACRS,OAAO;4BAAEV,MAAM;4BAAUF,aAAa;wBAAe;wBACrDa,YAAY;4BAAEX,MAAM;4BAAWK,SAAS;4BAAMP,aAAa;wBAA6B;wBACxFc,aAAa;4BAAEZ,MAAM;4BAAUK,SAAS;4BAAGP,aAAa;wBAA8B;oBAC1F;oBACAS,UAAU;wBAAC;qBAAQ;gBACvB;gBACAC,mBAAmB;oBAAC;oBAAsB;iBAAa;YAC3D;YACAK,uBAAuB;gBACnBhB,MAAM;gBACNC,aAAa;gBACbC,aAAa;oBACTC,MAAM;oBACNC,YAAY;wBACRC,KAAK;4BAAEF,MAAM;4BAAUF,aAAa;wBAAqB;wBACzDgB,SAAS;4BACLd,MAAM;4BACNF,aAAa;4BACbiB,OAAO;gCACHf,MAAM;gCACNC,YAAY;oCACRD,MAAM;wCAAEA,MAAM;wCAAUgB,MAAM;4CAAC;4CAAS;4CAAQ;4CAAS;yCAAO;oCAAC;oCACjEC,UAAU;wCAAEjB,MAAM;wCAAUF,aAAa;oCAAe;oCACxDoB,OAAO;wCAAElB,MAAM;wCAAUF,aAAa;oCAAyB;oCAC/DqB,KAAK;wCAAEnB,MAAM;wCAAUF,aAAa;oCAAwB;gCAChE;4BACJ;wBACJ;wBACAa,YAAY;4BAAEX,MAAM;4BAAWK,SAAS;wBAAM;oBAClD;oBACAE,UAAU;wBAAC;qBAAM;gBACrB;gBACAC,mBAAmB;oBAAC;oBAAsB;iBAAkB;YAChE;QACJ;QAEA,IAAI,CAACY,KAAK,GAAG;YACTC,eAAe;YACfC,oBAAoB;YACpBC,kBAAkB;YAClBC,WAAW,CAAC;YACZC,cAAc;QAClB;IACJ;IAEA,MAAMC,aAAa;QACf,IAAI;YACA,4BAA4B;YAC5B,MAAM,IAAI,CAAC9C,IAAI,CAAC8C,UAAU;YAC1BC,QAAQC,KAAK,CAAC;YAEd,gCAAgC;YAChC,MAAM,IAAI,CAACC,WAAW;YACtBF,QAAQC,KAAK,CAAC;YAEdD,QAAQC,KAAK,CAAC;QAClB,EAAE,OAAOA,OAAO;YACZD,QAAQC,KAAK,CAAC,sCAAsCA;YACpDrD,QAAQuD,IAAI,CAAC;QACjB;IACJ;IAEA,MAAMD,cAAc;QAChB,IAAI,CAAC,IAAI,CAAC3D,OAAO,EAAE;YACf,IAAI,CAACA,OAAO,GAAG,MAAMN,SAASmE,MAAM,CAAC;gBACjCC,UAAU;gBACVC,MAAM;oBACF;oBACA;oBACA;oBACA;iBACH;YACL;YACA,IAAI,CAAC9D,IAAI,GAAG,MAAM,IAAI,CAACD,OAAO,CAACgE,OAAO;QAC1C;IACJ;IAEA,MAAMC,eAAeF,IAAI,EAAEG,YAAY,EAAE;QACrC,MAAM,IAAI,CAACP,WAAW;QAEtBF,QAAQC,KAAK,CAAC,CAAC,mCAAmC,EAAEQ,aAAaC,SAAS,EAAE;QAE5E,MAAM,IAAI,CAAClE,IAAI,CAACmE,IAAI,CAACL,KAAK/B,GAAG,EAAE;YAC3BqC,WAAW;YACXC,SAAS;QACb;QAEA,IAAIP,KAAK3B,QAAQ,GAAG,GAAG;YACnB,MAAM,IAAI,CAACnC,IAAI,CAACsE,cAAc,CAACR,KAAK3B,QAAQ;QAChD;QAEA,MAAMoC,YAAY,IAAIC,OAAOC,WAAW,GAAGC,OAAO,CAAC,SAAS;QAC5D,MAAM1C,WAAW8B,KAAK9B,QAAQ,IAAI,CAAC,WAAW,EAAEiC,aAAaC,SAAS,CAAC,CAAC,EAAEK,UAAU,IAAI,CAAC;QACzF,MAAMI,WAAW,CAAC,iBAAiB,EAAE3C,UAAU;QAE/C,MAAM,IAAI,CAAChC,IAAI,CAACwC,UAAU,CAAC;YACvBoC,MAAMD;YACN1C,UAAU6B,KAAK7B,QAAQ,IAAI;QAC/B;QAEA,OAAO;YACH4C,SAAS;YACT7C,UAAUA;YACV2C,UAAUA;YACV5C,KAAK+B,KAAK/B,GAAG;YACb+C,OAAO,MAAM,IAAI,CAAC9E,IAAI,CAAC8E,KAAK;YAC5BC,MAAM,GAAG,IAAI,CAAC/E,IAAI,CAACgF,YAAY,IAAIC,SAAS,KAAK,CAAC,EAAE,IAAI,CAACjF,IAAI,CAACgF,YAAY,IAAIE,UAAU,KAAK;YAC7FC,YAAYlB,aAAaC,SAAS;YAClCK,WAAW,IAAIC,OAAOC,WAAW;QACrC;IACJ;IAEA,MAAMW,aAAatB,IAAI,EAAEG,YAAY,EAAE;QACnC,MAAM,IAAI,CAACP,WAAW;QAEtBF,QAAQC,KAAK,CAAC,CAAC,+BAA+B,EAAEQ,aAAaC,SAAS,CAAC,GAAG,EAAEJ,KAAKvB,KAAK,CAAC,CAAC,CAAC;QAEzF,MAAM,IAAI,CAACvC,IAAI,CAACmE,IAAI,CAAC,0BAA0B;YAC3CC,WAAW;YACXC,SAAS;QACb;QAEA,kCAAkC;QAClC,IAAI;YACA,MAAM,IAAI,CAACrE,IAAI,CAACqF,eAAe,CAAC,6DAA6D;gBAAEhB,SAAS;YAAK;YAC7G,MAAM,IAAI,CAACrE,IAAI,CAACsF,KAAK,CAAC;YACtB,MAAM,IAAI,CAACtF,IAAI,CAACsE,cAAc,CAAC;QACnC,EAAE,OAAOiB,GAAG;QACR,4BAA4B;QAChC;QAEA,iBAAiB;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACxF,IAAI,CAACqF,eAAe,CAAC,uCAAuC;YAAEhB,SAAS;QAAM;QAC1G,MAAMmB,UAAUC,IAAI,CAAC3B,KAAKvB,KAAK;QAC/B,MAAMiD,UAAUE,KAAK,CAAC;QAEtB,mBAAmB;QACnB,MAAM,IAAI,CAAC1F,IAAI,CAACqF,eAAe,CAAC,0BAA0B;YAAEhB,SAAS;QAAM;QAE3E,kBAAkB;QAClB,MAAMsB,UAAU,MAAM,IAAI,CAAC3F,IAAI,CAAC4F,MAAM,CAAC,sBAAsBC,CAAAA,WACzDA,SAASC,KAAK,CAAC,GAAGhC,KAAKrB,WAAW,IAAI,GAAGsD,GAAG,CAACC,CAAAA,KAAMA,GAAGC,WAAW,CAACC,IAAI;QAG1E,IAAIC,iBAAiB;QACrB,IAAIrC,KAAKtB,UAAU,EAAE;YACjB,MAAM+B,YAAY,IAAIC,OAAOC,WAAW,GAAGC,OAAO,CAAC,SAAS;YAC5D,MAAM1C,WAAW,CAAC,cAAc,EAAE8B,KAAKvB,KAAK,CAAC6D,WAAW,GAAG1B,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAEH,UAAU,IAAI,CAAC;YAClG,MAAM,IAAI,CAACvE,IAAI,CAACwC,UAAU,CAAC;gBAAEoC,MAAM,CAAC,iBAAiB,EAAE5C,UAAU;YAAC;YAClEmE,iBAAiB;gBACbnE;gBACA4C,MAAM,CAAC,iBAAiB,EAAE5C,UAAU;gBACpCD,KAAK,IAAI,CAAC/B,IAAI,CAAC+B,GAAG;YACtB;QACJ;QAEA,OAAO;YACH8C,SAAS;YACTtC,OAAOuB,KAAKvB,KAAK;YACjBoD,SAASA;YACTlD,aAAakD,QAAQU,MAAM;YAC3B7D,YAAY2D;YACZpE,KAAK,IAAI,CAAC/B,IAAI,CAAC+B,GAAG;YAClB+C,OAAO,MAAM,IAAI,CAAC9E,IAAI,CAAC8E,KAAK;YAC5BwB,YAAYrC,aAAaC,SAAS;YAClCK,WAAW,IAAIC,OAAOC,WAAW;QACrC;IACJ;IAEA,MAAM8B,oBAAoBzC,IAAI,EAAEG,YAAY,EAAE;QAC1C,MAAM,IAAI,CAACP,WAAW;QAEtBF,QAAQC,KAAK,CAAC,CAAC,kCAAkC,EAAEQ,aAAaC,SAAS,CAAC,EAAE,EAAEJ,KAAK/B,GAAG,EAAE;QAExF,MAAM,IAAI,CAAC/B,IAAI,CAACmE,IAAI,CAACL,KAAK/B,GAAG,EAAE;YAC3BqC,WAAW;YACXC,SAAS;QACb;QAEA,MAAMsB,UAAU,EAAE;QAElB,KAAK,MAAMa,UAAU1C,KAAKnB,OAAO,IAAI,EAAE,CAAE;YACrC,IAAI;gBACA,OAAQ6D,OAAO3E,IAAI;oBACf,KAAK;wBACD,MAAM,IAAI,CAAC7B,IAAI,CAACqF,eAAe,CAACmB,OAAO1D,QAAQ,EAAE;4BAAEuB,SAAS;wBAAK;wBACjE,MAAM,IAAI,CAACrE,IAAI,CAACsF,KAAK,CAACkB,OAAO1D,QAAQ;wBACrC6C,QAAQc,IAAI,CAAC;4BAAED,QAAQ;4BAAS1D,UAAU0D,OAAO1D,QAAQ;4BAAE+B,SAAS;wBAAK;wBACzE;oBAEJ,KAAK;wBACD,MAAM,IAAI,CAAC7E,IAAI,CAACqF,eAAe,CAACmB,OAAO1D,QAAQ,EAAE;4BAAEuB,SAAS;wBAAK;wBACjE,MAAM,IAAI,CAACrE,IAAI,CAACyF,IAAI,CAACe,OAAO1D,QAAQ,EAAE0D,OAAOzD,KAAK;wBAClD4C,QAAQc,IAAI,CAAC;4BAAED,QAAQ;4BAAQ1D,UAAU0D,OAAO1D,QAAQ;4BAAEC,OAAOyD,OAAOzD,KAAK;4BAAE8B,SAAS;wBAAK;wBAC7F;oBAEJ,KAAK;wBACD,MAAM,IAAI,CAAC7E,IAAI,CAAC0F,KAAK,CAACc,OAAO1D,QAAQ,IAAI,QAAQ0D,OAAOxD,GAAG;wBAC3D2C,QAAQc,IAAI,CAAC;4BAAED,QAAQ;4BAASxD,KAAKwD,OAAOxD,GAAG;4BAAE6B,SAAS;wBAAK;wBAC/D;oBAEJ,KAAK;wBACD,MAAM,IAAI,CAAC7E,IAAI,CAACsE,cAAc,CAAClD,SAASoF,OAAOzD,KAAK,KAAK;wBACzD4C,QAAQc,IAAI,CAAC;4BAAED,QAAQ;4BAAQE,UAAUF,OAAOzD,KAAK;4BAAE8B,SAAS;wBAAK;wBACrE;gBACR;YACJ,EAAE,OAAOpB,OAAO;gBACZkC,QAAQc,IAAI,CAAC;oBACTD,QAAQA,OAAO3E,IAAI;oBACnBiB,UAAU0D,OAAO1D,QAAQ;oBACzB+B,SAAS;oBACTpB,OAAOA,MAAMkD,OAAO;gBACxB;YACJ;QACJ;QAEA,IAAIR,iBAAiB;QACrB,IAAIrC,KAAKtB,UAAU,EAAE;YACjB,MAAM+B,YAAY,IAAIC,OAAOC,WAAW,GAAGC,OAAO,CAAC,SAAS;YAC5D,MAAM1C,WAAW,CAAC,YAAY,EAAEiC,aAAaC,SAAS,CAAC,CAAC,EAAEK,UAAU,IAAI,CAAC;YACzE,MAAM,IAAI,CAACvE,IAAI,CAACwC,UAAU,CAAC;gBAAEoC,MAAM,CAAC,iBAAiB,EAAE5C,UAAU;YAAC;YAClEmE,iBAAiB;gBACbnE;gBACA4C,MAAM,CAAC,iBAAiB,EAAE5C,UAAU;YACxC;QACJ;QAEA,OAAO;YACH6C,SAAS;YACT9C,KAAK+B,KAAK/B,GAAG;YACbY,SAASgD;YACTnD,YAAY2D;YACZrB,OAAO,MAAM,IAAI,CAAC9E,IAAI,CAAC8E,KAAK;YAC5B8B,cAAc3C,aAAaC,SAAS;YACpCK,WAAW,IAAIC,OAAOC,WAAW;QACrC;IACJ;IAEA,MAAMoC,cAAcF,OAAO,EAAE;QACzB,IAAI;YACA,IAAI,CAAC1D,KAAK,CAACC,aAAa;YACxB,IAAI,CAACD,KAAK,CAACK,YAAY,GAAGkB,KAAKsC,GAAG;YAElC,6BAA6B;YAC7B,MAAMC,UAAU;gBACZC,SAAS;oBACL,iBAAiBL,QAAQM,MAAM,EAAEC,SAASC;oBAC1C,gBAAgBR,QAAQM,MAAM,EAAEC,SAAShD;gBAC7C;gBACAkD,MAAMT;YACV;YAEA,MAAMU,WAAW;gBACbC,WAAW,KAAO;gBAClBC,KAAK,CAACC;oBACF,oDAAoD;oBACpD,IAAI,CAACC,YAAY,GAAGC,KAAKC,KAAK,CAACH;gBACnC;YACJ;YAEA,uBAAuB;YACvB,IAAII,uBAAuB;YAC3B,MAAM,IAAI,CAACnH,IAAI,CAACoH,mBAAmB,CAACd,SAASM,UAAU;gBACnDO,uBAAuB;YAC3B;YAEA,IAAI,CAACA,sBAAsB;gBACvB,IAAI,CAAC3E,KAAK,CAACG,gBAAgB;gBAC3B,OAAO,IAAI,CAACqE,YAAY,IAAI;oBACxBK,SAAS;oBACTC,IAAIpB,QAAQoB,EAAE;oBACdtE,OAAO;wBACHuE,MAAM,CAAC;wBACPrB,SAAS;oBACb;gBACJ;YACJ;YAEA,IAAI,CAAC1D,KAAK,CAACE,kBAAkB;YAE7B,yCAAyC;YACzC,IAAIwD,QAAQsB,MAAM,KAAK,cAAc;gBACjC,OAAO;oBACHH,SAAS;oBACTC,IAAIpB,QAAQoB,EAAE;oBACdG,QAAQ;wBACJC,iBAAiB;wBACjBC,cAAc;4BACV5G,OAAO,CAAC;wBACZ;wBACA6G,YAAY;4BACR3G,MAAM;4BACN4G,SAAS;4BACTC,gBAAgB;wBACpB;oBACJ;gBACJ;YACJ,OAAO,IAAI5B,QAAQsB,MAAM,KAAK,cAAc;gBACxC,OAAO;oBACHH,SAAS;oBACTC,IAAIpB,QAAQoB,EAAE;oBACdG,QAAQ;wBAAE1G,OAAOgH,OAAOC,MAAM,CAAC,IAAI,CAACjH,KAAK;oBAAE;gBAC/C;YACJ,OAAO,IAAImF,QAAQsB,MAAM,KAAK,cAAc;gBACxC,MAAMS,WAAW/B,QAAQM,MAAM,CAACvF,IAAI;gBACpC,MAAMoC,OAAO6C,QAAQM,MAAM,CAAC0B,SAAS,IAAI,CAAC;gBAC1C,MAAM1E,eAAe8C,QAAQ9C,YAAY,IAAI;oBACzCC,WAAW;oBACX0E,eAAe;gBACnB;gBAEA,0BAA0B;gBAC1B,IAAI,CAAC3F,KAAK,CAACI,SAAS,CAACqF,SAAS,GAAG,AAAC,CAAA,IAAI,CAACzF,KAAK,CAACI,SAAS,CAACqF,SAAS,IAAI,CAAA,IAAK;gBAEzE,IAAIR;gBACJ,IAAIQ,aAAa,mBAAmB;oBAChCR,SAAS,MAAM,IAAI,CAAClE,cAAc,CAACF,MAAMG;gBAC7C,OAAO,IAAIyE,aAAa,iBAAiB;oBACrCR,SAAS,MAAM,IAAI,CAAC9C,YAAY,CAACtB,MAAMG;gBAC3C,OAAO,IAAIyE,aAAa,yBAAyB;oBAC7CR,SAAS,MAAM,IAAI,CAAC3B,mBAAmB,CAACzC,MAAMG;gBAClD,OAAO;oBACH,MAAM,IAAI4E,MAAM,CAAC,cAAc,EAAEH,UAAU;gBAC/C;gBAEAlF,QAAQC,KAAK,CAAC,CAAC,kBAAkB,EAAEiF,SAAS,aAAa,EAAEzE,aAAaC,SAAS,EAAE;gBAEnF,OAAO;oBACH4D,SAAS;oBACTC,IAAIpB,QAAQoB,EAAE;oBACdG,QAAQ;wBACJY,SAAS;4BAAC;gCACNjH,MAAM;gCACNkH,MAAMrB,KAAKsB,SAAS,CAACd,QAAQ,MAAM;4BACvC;yBAAE;oBACN;gBACJ;YACJ;QACJ,EAAE,OAAOzE,OAAO;YACZD,QAAQC,KAAK,CAAC,wCAAwCA;YACtD,OAAO;gBACHqE,SAAS;gBACTC,IAAIpB,QAAQoB,EAAE,IAAI;gBAClBtE,OAAO;oBACHuE,MAAM,CAAC;oBACPrB,SAASlD,MAAMkD,OAAO;gBAC1B;YACJ;QACJ;IACJ;IAEA,MAAMsC,QAAQ;QACV,MAAM,IAAI,CAAC1F,UAAU;QAErB,IAAI,CAACtD,EAAE,CAACiJ,EAAE,CAAC,QAAQ,OAAOC;YACtB,IAAI;gBACA,MAAMxC,UAAUe,KAAKC,KAAK,CAACwB;gBAC3B,MAAM9B,WAAW,MAAM,IAAI,CAACR,aAAa,CAACF;gBAC1CnD,QAAQ4F,GAAG,CAAC1B,KAAKsB,SAAS,CAAC3B;YAC/B,EAAE,OAAO5D,OAAO;gBACZD,QAAQ4F,GAAG,CAAC1B,KAAKsB,SAAS,CAAC;oBACvBlB,SAAS;oBACTC,IAAI;oBACJtE,OAAO;wBACHuE,MAAM,CAAC;wBACPrB,SAAS,CAAC,aAAa,EAAElD,MAAMkD,OAAO,EAAE;oBAC5C;gBACJ;YACJ;QACJ;QAEA,kBAAkB;QAClBvG,QAAQ8I,EAAE,CAAC,UAAU;YACjB1F,QAAQC,KAAK,CAAC;YACd,MAAM,IAAI,CAAC4F,QAAQ;YACnBjJ,QAAQuD,IAAI,CAAC;QACjB;QAEA,8BAA8B;QAC9B2F,YAAY;YACR9F,QAAQC,KAAK,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAACR,KAAK,CAACC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAACD,KAAK,CAACE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAACF,KAAK,CAACG,gBAAgB,CAAC,SAAS,CAAC;YAC3JI,QAAQC,KAAK,CAAC,CAAC,wBAAwB,CAAC,EAAEiE,KAAKsB,SAAS,CAAC,IAAI,CAAC/F,KAAK,CAACI,SAAS;QACjF,GAAG,QAAQ,eAAe;IAC9B;IAEA,MAAMkG,WAAW;QACb,MAAMC,YAAY,MAAM,IAAI,CAAC/I,IAAI,CAAC8I,QAAQ;QAC1C,OAAO;YACHE,QAAQ;gBACJ/H,MAAM;gBACNgI,QAAQtJ,QAAQsJ,MAAM;gBACtB,GAAG,IAAI,CAACzG,KAAK;YACjB;YACAsF,gBAAgBiB;QACpB;IACJ;IAEA,MAAMH,WAAW;QACb,IAAI;YACA,IAAI,IAAI,CAACtJ,OAAO,EAAE,MAAM,IAAI,CAACA,OAAO,CAAC4J,KAAK;YAC1C,IAAI,IAAI,CAAC1J,EAAE,EAAE,IAAI,CAACA,EAAE,CAAC0J,KAAK;YAC1B,IAAI,IAAI,CAAClJ,IAAI,EAAE,MAAM,IAAI,CAACA,IAAI,CAAC4I,QAAQ;YACvC7F,QAAQC,KAAK,CAAC;QAClB,EAAE,OAAOA,OAAO;YACZD,QAAQC,KAAK,CAAC,uCAAuCA;QACzD;IACJ;AACJ;AAEA,mBAAmB;AACnB,MAAMgG,SAAS,IAAI5J,iCAAiC;IAChDa,UAAUN,QAAQO,GAAG,CAACC,aAAa;IACnCC,cAAcT,QAAQO,GAAG,CAACG,iBAAiB,KAAK;IAChDK,cAAcC,SAAShB,QAAQO,GAAG,CAACU,kBAAkB,KAAK;AAC9D;AAEAoI,OAAOR,KAAK,GAAGW,KAAK,CAACnG,CAAAA;IACjBD,QAAQC,KAAK,CAAC,qEAAqEA;IACnFrD,QAAQuD,IAAI,CAAC;AACjB"}
1
+ {"version":3,"sources":["../../src/mcp/playwright-mcp-server-auth.js"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Enhanced Playwright MCP Server with Authentication\r\n * Includes token-based authentication and authorization\r\n */\r\n\r\nconst { chromium } = require('playwright');\r\nconst readline = require('readline');\r\nconst MCPAuthMiddleware = require('./auth-middleware.js');\r\n\r\nclass AuthenticatedPlaywrightMCPServer {\r\n constructor(options = {}) {\r\n this.browser = null;\r\n this.page = null;\r\n this.rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false\r\n });\r\n\r\n // Initialize authentication middleware\r\n this.auth = new MCPAuthMiddleware({\r\n redisUrl: options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,\r\n authRequired: options.authRequired !== false && process.env.MCP_AUTH_REQUIRED !== 'false',\r\n agentConfigPath: options.agentConfigPath || process.env.MCP_AGENT_CONFIG || './config/agent-whitelist.json',\r\n skillConfigPath: options.skillConfigPath || process.env.MCP_SKILL_CONFIG || './config/skill-requirements.json',\r\n rateLimitMax: options.rateLimitMax || parseInt(process.env.MCP_RATE_LIMIT_MAX) || 60,\r\n rateLimitWindow: options.rateLimitWindow || parseInt(process.env.MCP_RATE_LIMIT_WINDOW) || 60\r\n });\r\n\r\n this.tools = {\r\n take_screenshot: {\r\n name: 'take_screenshot',\r\n description: 'Take a screenshot of a webpage (requires browser-automation, screenshot-capture skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n url: { type: 'string', description: 'URL to capture' },\r\n filename: { type: 'string', description: 'Screenshot filename (optional)' },\r\n fullPage: { type: 'boolean', default: false, description: 'Capture full page' },\r\n waitTime: { type: 'number', default: 3000, description: 'Wait time before screenshot (ms)' }\r\n },\r\n required: ['url']\r\n },\r\n skillRequirements: ['browser-automation', 'screenshot-capture']\r\n },\r\n search_google: {\r\n name: 'search_google',\r\n description: 'Search Google and return results (requires browser-automation, web-search skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n query: { type: 'string', description: 'Search query' },\r\n screenshot: { type: 'boolean', default: true, description: 'Take screenshot of results' },\r\n resultCount: { type: 'number', default: 5, description: 'Number of results to return' }\r\n },\r\n required: ['query']\r\n },\r\n skillRequirements: ['browser-automation', 'web-search']\r\n },\r\n navigate_and_interact: {\r\n name: 'navigate_and_interact',\r\n description: 'Navigate to a webpage and interact with elements (requires browser-automation, web-interaction skills)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n url: { type: 'string', description: 'URL to navigate to' },\r\n actions: {\r\n type: 'array',\r\n description: 'Array of actions to perform',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n type: { type: 'string', enum: ['click', 'fill', 'press', 'wait'] },\r\n selector: { type: 'string', description: 'CSS selector' },\r\n value: { type: 'string', description: 'Value for fill actions' },\r\n key: { type: 'string', description: 'Key for press actions' }\r\n }\r\n }\r\n },\r\n screenshot: { type: 'boolean', default: false }\r\n },\r\n required: ['url']\r\n },\r\n skillRequirements: ['browser-automation', 'web-interaction']\r\n }\r\n };\r\n\r\n this.stats = {\r\n totalRequests: 0,\r\n authorizedRequests: 0,\r\n rejectedRequests: 0,\r\n toolUsage: {},\r\n lastActivity: null\r\n };\r\n }\r\n\r\n async initialize() {\r\n try {\r\n // Initialize authentication\r\n await this.auth.initialize();\r\n console.error('[MCP-Server] Authentication middleware initialized');\r\n\r\n // Initialize Playwright browser\r\n await this.initBrowser();\r\n console.error('[MCP-Server] Playwright browser initialized');\r\n\r\n console.error('[MCP-Server] Authenticated Playwright MCP Server ready');\r\n } catch (error) {\r\n console.error('[MCP-Server] Failed to initialize:', error);\r\n process.exit(1);\r\n }\r\n }\r\n\r\n async initBrowser() {\r\n if (!this.browser) {\r\n this.browser = await chromium.launch({\r\n headless: true,\r\n args: [\r\n '--no-sandbox',\r\n '--disable-setuid-sandbox',\r\n '--disable-dev-shm-usage',\r\n '--disable-gpu'\r\n ]\r\n });\r\n this.page = await this.browser.newPage();\r\n }\r\n }\r\n\r\n async takeScreenshot(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Taking screenshot for ${agentContext.agentType}`);\r\n\r\n await this.page.goto(args.url, {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n if (args.waitTime > 0) {\r\n await this.page.waitForTimeout(args.waitTime);\r\n }\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = args.filename || `screenshot-${agentContext.agentType}-${timestamp}.png`;\r\n const filepath = `/app/screenshots/${filename}`;\r\n\r\n await this.page.screenshot({\r\n path: filepath,\r\n fullPage: args.fullPage || false\r\n });\r\n\r\n return {\r\n success: true,\r\n filename: filename,\r\n filepath: filepath,\r\n url: args.url,\r\n title: await this.page.title(),\r\n size: `${this.page.viewportSize()?.width || 1280}x${this.page.viewportSize()?.height || 720}`,\r\n capturedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async searchGoogle(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Google search for ${agentContext.agentType}: \"${args.query}\"`);\r\n\r\n await this.page.goto('https://www.google.com', {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n // Handle cookies popup if present\r\n try {\r\n await this.page.waitForSelector('button[aria-label*=\"Accept\"], button[aria-label*=\"agree\"]', { timeout: 3000 });\r\n await this.page.click('button[aria-label*=\"Accept\"], button[aria-label*=\"agree\"]');\r\n await this.page.waitForTimeout(1000);\r\n } catch (e) {\r\n // No cookie popup, continue\r\n }\r\n\r\n // Perform search\r\n const searchBox = await this.page.waitForSelector('textarea[name=\"q\"], input[name=\"q\"]', { timeout: 10000 });\r\n await searchBox.fill(args.query);\r\n await searchBox.press('Enter');\r\n\r\n // Wait for results\r\n await this.page.waitForSelector('[role=\"main\"], #search', { timeout: 15000 });\r\n\r\n // Extract results\r\n const results = await this.page.$$eval('div[data-hveid] h3', elements =>\r\n elements.slice(0, args.resultCount || 5).map(el => el.textContent.trim())\r\n );\r\n\r\n let screenshotInfo = null;\r\n if (args.screenshot) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `google-search-${args.query.toLowerCase().replace(/\\s+/g, '-')}-${timestamp}.png`;\r\n await this.page.screenshot({ path: `/app/screenshots/${filename}` });\r\n screenshotInfo = {\r\n filename,\r\n path: `/app/screenshots/${filename}`,\r\n url: this.page.url()\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n query: args.query,\r\n results: results,\r\n resultCount: results.length,\r\n screenshot: screenshotInfo,\r\n url: this.page.url(),\r\n title: await this.page.title(),\r\n searchedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async navigateAndInteract(args, agentContext) {\r\n await this.initBrowser();\r\n\r\n console.error(`[MCP-Server] Page interaction for ${agentContext.agentType}: ${args.url}`);\r\n\r\n await this.page.goto(args.url, {\r\n waitUntil: 'networkidle',\r\n timeout: 15000\r\n });\r\n\r\n const results = [];\r\n\r\n for (const action of args.actions || []) {\r\n try {\r\n switch (action.type) {\r\n case 'click':\r\n await this.page.waitForSelector(action.selector, { timeout: 5000 });\r\n await this.page.click(action.selector);\r\n results.push({ action: 'click', selector: action.selector, success: true });\r\n break;\r\n\r\n case 'fill':\r\n await this.page.waitForSelector(action.selector, { timeout: 5000 });\r\n await this.page.fill(action.selector, action.value);\r\n results.push({ action: 'fill', selector: action.selector, value: action.value, success: true });\r\n break;\r\n\r\n case 'press':\r\n await this.page.press(action.selector || 'body', action.key);\r\n results.push({ action: 'press', key: action.key, success: true });\r\n break;\r\n\r\n case 'wait':\r\n await this.page.waitForTimeout(parseInt(action.value) || 1000);\r\n results.push({ action: 'wait', duration: action.value, success: true });\r\n break;\r\n }\r\n } catch (error) {\r\n results.push({\r\n action: action.type,\r\n selector: action.selector,\r\n success: false,\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n let screenshotInfo = null;\r\n if (args.screenshot) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `interaction-${agentContext.agentType}-${timestamp}.png`;\r\n await this.page.screenshot({ path: `/app/screenshots/${filename}` });\r\n screenshotInfo = {\r\n filename,\r\n path: `/app/screenshots/${filename}`\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n url: args.url,\r\n actions: results,\r\n screenshot: screenshotInfo,\r\n title: await this.page.title(),\r\n interactedBy: agentContext.agentType,\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n async handleMessage(message) {\r\n try {\r\n this.stats.totalRequests++;\r\n this.stats.lastActivity = Date.now();\r\n\r\n // Initialize request context\r\n const request = {\r\n headers: {\r\n 'x-agent-token': message.params?.context?.agentToken,\r\n 'x-agent-type': message.params?.context?.agentType\r\n },\r\n body: message\r\n };\r\n\r\n const response = {\r\n writeHead: () => {},\r\n end: (data) => {\r\n // For JSON-RPC, we'll just return the data directly\r\n this.responseData = JSON.parse(data);\r\n }\r\n };\r\n\r\n // Authenticate request\r\n let authenticationPassed = false;\r\n await this.auth.authenticateRequest(request, response, () => {\r\n authenticationPassed = true;\r\n });\r\n\r\n if (!authenticationPassed) {\r\n this.stats.rejectedRequests++;\r\n return this.responseData || {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n error: {\r\n code: -32001,\r\n message: 'Authentication failed'\r\n }\r\n };\r\n }\r\n\r\n this.stats.authorizedRequests++;\r\n\r\n // Authentication passed, process request\r\n if (message.method === 'initialize') {\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: {\r\n protocolVersion: '2024-11-05',\r\n capabilities: {\r\n tools: {}\r\n },\r\n serverInfo: {\r\n name: 'playwright-mcp-server-authenticated',\r\n version: '1.0.0',\r\n authentication: 'enabled'\r\n }\r\n }\r\n };\r\n } else if (message.method === 'tools/list') {\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: { tools: Object.values(this.tools) }\r\n };\r\n } else if (message.method === 'tools/call') {\r\n const toolName = message.params.name;\r\n const args = message.params.arguments || {};\r\n const agentContext = request.agentContext || {\r\n agentType: 'unknown',\r\n authenticated: false\r\n };\r\n\r\n // Update tool usage stats\r\n this.stats.toolUsage[toolName] = (this.stats.toolUsage[toolName] || 0) + 1;\r\n\r\n let result;\r\n if (toolName === 'take_screenshot') {\r\n result = await this.takeScreenshot(args, agentContext);\r\n } else if (toolName === 'search_google') {\r\n result = await this.searchGoogle(args, agentContext);\r\n } else if (toolName === 'navigate_and_interact') {\r\n result = await this.navigateAndInteract(args, agentContext);\r\n } else {\r\n throw new Error(`Unknown tool: ${toolName}`);\r\n }\r\n\r\n console.error(`[MCP-Server] Tool ${toolName} executed by ${agentContext.agentType}`);\r\n\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id,\r\n result: {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify(result, null, 2)\r\n }]\r\n }\r\n };\r\n }\r\n } catch (error) {\r\n console.error('[MCP-Server] Error handling message:', error);\r\n return {\r\n jsonrpc: '2.0',\r\n id: message.id || null,\r\n error: {\r\n code: -32000,\r\n message: error.message\r\n }\r\n };\r\n }\r\n }\r\n\r\n async start() {\r\n await this.initialize();\r\n\r\n this.rl.on('line', async (line) => {\r\n try {\r\n const message = JSON.parse(line);\r\n const response = await this.handleMessage(message);\r\n console.log(JSON.stringify(response));\r\n } catch (error) {\r\n console.log(JSON.stringify({\r\n jsonrpc: '2.0',\r\n id: null,\r\n error: {\r\n code: -32700,\r\n message: `Parse error: ${error.message}`\r\n }\r\n }));\r\n }\r\n });\r\n\r\n // Cleanup on exit\r\n process.on('SIGINT', async () => {\r\n console.error('[MCP-Server] Shutting down authenticated Playwright MCP Server...');\r\n await this.shutdown();\r\n process.exit(0);\r\n });\r\n\r\n // Log statistics periodically\r\n setInterval(() => {\r\n console.error(`[MCP-Server] Stats: ${this.stats.totalRequests} total, ${this.stats.authorizedRequests} authorized, ${this.stats.rejectedRequests} rejected`);\r\n console.error(`[MCP-Server] Tool usage:`, JSON.stringify(this.stats.toolUsage));\r\n }, 60000); // Every minute\r\n }\r\n\r\n async getStats() {\r\n const authStats = await this.auth.getStats();\r\n return {\r\n server: {\r\n name: 'playwright-mcp-server-authenticated',\r\n uptime: process.uptime(),\r\n ...this.stats\r\n },\r\n authentication: authStats\r\n };\r\n }\r\n\r\n async shutdown() {\r\n try {\r\n if (this.browser) await this.browser.close();\r\n if (this.rl) this.rl.close();\r\n if (this.auth) await this.auth.shutdown();\r\n console.error('[MCP-Server] Shutdown complete');\r\n } catch (error) {\r\n console.error('[MCP-Server] Error during shutdown:', error);\r\n }\r\n }\r\n}\r\n\r\n// Start the server\r\nconst server = new AuthenticatedPlaywrightMCPServer({\r\n redisUrl: process.env.MCP_REDIS_URL,\r\n authRequired: process.env.MCP_AUTH_REQUIRED !== 'false',\r\n rateLimitMax: parseInt(process.env.MCP_RATE_LIMIT_MAX) || 60\r\n});\r\n\r\nserver.start().catch(error => {\r\n console.error('[MCP-Server] Failed to start authenticated Playwright MCP Server:', error);\r\n process.exit(1);\r\n});"],"names":["chromium","require","readline","MCPAuthMiddleware","AuthenticatedPlaywrightMCPServer","options","browser","page","rl","createInterface","input","process","stdin","output","stdout","terminal","auth","redisUrl","env","CFN_REDIS_URL","MCP_REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","authRequired","MCP_AUTH_REQUIRED","agentConfigPath","MCP_AGENT_CONFIG","skillConfigPath","MCP_SKILL_CONFIG","rateLimitMax","parseInt","MCP_RATE_LIMIT_MAX","rateLimitWindow","MCP_RATE_LIMIT_WINDOW","tools","take_screenshot","name","description","inputSchema","type","properties","url","filename","fullPage","default","waitTime","required","skillRequirements","search_google","query","screenshot","resultCount","navigate_and_interact","actions","items","enum","selector","value","key","stats","totalRequests","authorizedRequests","rejectedRequests","toolUsage","lastActivity","initialize","console","error","initBrowser","exit","launch","headless","args","newPage","takeScreenshot","agentContext","agentType","goto","waitUntil","timeout","waitForTimeout","timestamp","Date","toISOString","replace","filepath","path","success","title","size","viewportSize","width","height","capturedBy","searchGoogle","waitForSelector","click","e","searchBox","fill","press","results","$$eval","elements","slice","map","el","textContent","trim","screenshotInfo","toLowerCase","length","searchedBy","navigateAndInteract","action","push","duration","message","interactedBy","handleMessage","now","request","headers","params","context","agentToken","body","response","writeHead","end","data","responseData","JSON","parse","authenticationPassed","authenticateRequest","jsonrpc","id","code","method","result","protocolVersion","capabilities","serverInfo","version","authentication","Object","values","toolName","arguments","authenticated","Error","content","text","stringify","start","on","line","log","shutdown","setInterval","getStats","authStats","server","uptime","close","catch"],"mappings":"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"}