claude-mpm 5.0.9__py3-none-any.whl → 5.6.23__py3-none-any.whl

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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (614) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +115 -0
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +13 -44
  11. claude_mpm/agents/base_agent.json +1 -1
  12. claude_mpm/agents/frontmatter_validator.py +70 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +457 -62
  14. claude_mpm/cli/__init__.py +5 -2
  15. claude_mpm/cli/__main__.py +4 -0
  16. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  17. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  18. claude_mpm/cli/commands/agents.py +177 -41
  19. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  20. claude_mpm/cli/commands/auto_configure.py +723 -236
  21. claude_mpm/cli/commands/autotodos.py +566 -0
  22. claude_mpm/cli/commands/commander.py +216 -0
  23. claude_mpm/cli/commands/config.py +88 -2
  24. claude_mpm/cli/commands/configure.py +1874 -170
  25. claude_mpm/cli/commands/configure_agent_display.py +27 -6
  26. claude_mpm/cli/commands/hook_errors.py +60 -60
  27. claude_mpm/cli/commands/monitor.py +2 -2
  28. claude_mpm/cli/commands/mpm_init/core.py +232 -46
  29. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  30. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  31. claude_mpm/cli/commands/postmortem.py +1 -1
  32. claude_mpm/cli/commands/profile.py +276 -0
  33. claude_mpm/cli/commands/run.py +35 -3
  34. claude_mpm/cli/commands/skill_source.py +51 -2
  35. claude_mpm/cli/commands/skills.py +379 -204
  36. claude_mpm/cli/commands/summarize.py +413 -0
  37. claude_mpm/cli/executor.py +141 -19
  38. claude_mpm/cli/interactive/__init__.py +10 -0
  39. claude_mpm/cli/interactive/agent_wizard.py +115 -60
  40. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  41. claude_mpm/cli/interactive/skill_selector.py +481 -0
  42. claude_mpm/cli/parsers/agents_parser.py +54 -9
  43. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  44. claude_mpm/cli/parsers/base_parser.py +88 -1
  45. claude_mpm/cli/parsers/commander_parser.py +116 -0
  46. claude_mpm/cli/parsers/config_parser.py +153 -83
  47. claude_mpm/cli/parsers/profile_parser.py +147 -0
  48. claude_mpm/cli/parsers/run_parser.py +10 -0
  49. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  50. claude_mpm/cli/parsers/skills_parser.py +1 -1
  51. claude_mpm/cli/startup.py +1017 -266
  52. claude_mpm/cli/startup_display.py +74 -6
  53. claude_mpm/cli/startup_logging.py +2 -2
  54. claude_mpm/cli/utils.py +7 -3
  55. claude_mpm/commander/__init__.py +78 -0
  56. claude_mpm/commander/adapters/__init__.py +60 -0
  57. claude_mpm/commander/adapters/auggie.py +260 -0
  58. claude_mpm/commander/adapters/base.py +288 -0
  59. claude_mpm/commander/adapters/claude_code.py +392 -0
  60. claude_mpm/commander/adapters/codex.py +237 -0
  61. claude_mpm/commander/adapters/communication.py +366 -0
  62. claude_mpm/commander/adapters/example_usage.py +310 -0
  63. claude_mpm/commander/adapters/mpm.py +389 -0
  64. claude_mpm/commander/adapters/registry.py +204 -0
  65. claude_mpm/commander/api/__init__.py +16 -0
  66. claude_mpm/commander/api/app.py +121 -0
  67. claude_mpm/commander/api/errors.py +133 -0
  68. claude_mpm/commander/api/routes/__init__.py +8 -0
  69. claude_mpm/commander/api/routes/events.py +184 -0
  70. claude_mpm/commander/api/routes/inbox.py +171 -0
  71. claude_mpm/commander/api/routes/messages.py +148 -0
  72. claude_mpm/commander/api/routes/projects.py +271 -0
  73. claude_mpm/commander/api/routes/sessions.py +226 -0
  74. claude_mpm/commander/api/routes/work.py +296 -0
  75. claude_mpm/commander/api/schemas.py +186 -0
  76. claude_mpm/commander/chat/__init__.py +7 -0
  77. claude_mpm/commander/chat/cli.py +146 -0
  78. claude_mpm/commander/chat/commands.py +96 -0
  79. claude_mpm/commander/chat/repl.py +310 -0
  80. claude_mpm/commander/config.py +51 -0
  81. claude_mpm/commander/config_loader.py +115 -0
  82. claude_mpm/commander/core/__init__.py +10 -0
  83. claude_mpm/commander/core/block_manager.py +325 -0
  84. claude_mpm/commander/core/response_manager.py +323 -0
  85. claude_mpm/commander/daemon.py +603 -0
  86. claude_mpm/commander/env_loader.py +59 -0
  87. claude_mpm/commander/events/__init__.py +26 -0
  88. claude_mpm/commander/events/manager.py +332 -0
  89. claude_mpm/commander/frameworks/__init__.py +12 -0
  90. claude_mpm/commander/frameworks/base.py +146 -0
  91. claude_mpm/commander/frameworks/claude_code.py +58 -0
  92. claude_mpm/commander/frameworks/mpm.py +62 -0
  93. claude_mpm/commander/inbox/__init__.py +16 -0
  94. claude_mpm/commander/inbox/dedup.py +128 -0
  95. claude_mpm/commander/inbox/inbox.py +224 -0
  96. claude_mpm/commander/inbox/models.py +70 -0
  97. claude_mpm/commander/instance_manager.py +450 -0
  98. claude_mpm/commander/llm/__init__.py +6 -0
  99. claude_mpm/commander/llm/openrouter_client.py +167 -0
  100. claude_mpm/commander/llm/summarizer.py +70 -0
  101. claude_mpm/commander/memory/__init__.py +45 -0
  102. claude_mpm/commander/memory/compression.py +347 -0
  103. claude_mpm/commander/memory/embeddings.py +230 -0
  104. claude_mpm/commander/memory/entities.py +310 -0
  105. claude_mpm/commander/memory/example_usage.py +290 -0
  106. claude_mpm/commander/memory/integration.py +325 -0
  107. claude_mpm/commander/memory/search.py +381 -0
  108. claude_mpm/commander/memory/store.py +657 -0
  109. claude_mpm/commander/models/__init__.py +18 -0
  110. claude_mpm/commander/models/events.py +121 -0
  111. claude_mpm/commander/models/project.py +162 -0
  112. claude_mpm/commander/models/work.py +214 -0
  113. claude_mpm/commander/parsing/__init__.py +20 -0
  114. claude_mpm/commander/parsing/extractor.py +132 -0
  115. claude_mpm/commander/parsing/output_parser.py +270 -0
  116. claude_mpm/commander/parsing/patterns.py +100 -0
  117. claude_mpm/commander/persistence/__init__.py +11 -0
  118. claude_mpm/commander/persistence/event_store.py +274 -0
  119. claude_mpm/commander/persistence/state_store.py +309 -0
  120. claude_mpm/commander/persistence/work_store.py +164 -0
  121. claude_mpm/commander/polling/__init__.py +13 -0
  122. claude_mpm/commander/polling/event_detector.py +104 -0
  123. claude_mpm/commander/polling/output_buffer.py +49 -0
  124. claude_mpm/commander/polling/output_poller.py +153 -0
  125. claude_mpm/commander/project_session.py +268 -0
  126. claude_mpm/commander/proxy/__init__.py +12 -0
  127. claude_mpm/commander/proxy/formatter.py +89 -0
  128. claude_mpm/commander/proxy/output_handler.py +191 -0
  129. claude_mpm/commander/proxy/relay.py +155 -0
  130. claude_mpm/commander/registry.py +410 -0
  131. claude_mpm/commander/runtime/__init__.py +10 -0
  132. claude_mpm/commander/runtime/executor.py +191 -0
  133. claude_mpm/commander/runtime/monitor.py +346 -0
  134. claude_mpm/commander/session/__init__.py +6 -0
  135. claude_mpm/commander/session/context.py +81 -0
  136. claude_mpm/commander/session/manager.py +59 -0
  137. claude_mpm/commander/tmux_orchestrator.py +361 -0
  138. claude_mpm/commander/web/__init__.py +1 -0
  139. claude_mpm/commander/work/__init__.py +30 -0
  140. claude_mpm/commander/work/executor.py +207 -0
  141. claude_mpm/commander/work/queue.py +405 -0
  142. claude_mpm/commander/workflow/__init__.py +27 -0
  143. claude_mpm/commander/workflow/event_handler.py +241 -0
  144. claude_mpm/commander/workflow/notifier.py +146 -0
  145. claude_mpm/commands/mpm-config.md +36 -0
  146. claude_mpm/commands/mpm-doctor.md +16 -21
  147. claude_mpm/commands/mpm-help.md +12 -286
  148. claude_mpm/commands/mpm-init.md +88 -506
  149. claude_mpm/commands/mpm-monitor.md +22 -401
  150. claude_mpm/commands/mpm-organize.md +128 -0
  151. claude_mpm/commands/mpm-postmortem.md +13 -107
  152. claude_mpm/commands/mpm-session-resume.md +20 -363
  153. claude_mpm/commands/mpm-status.md +13 -69
  154. claude_mpm/commands/mpm-ticket-view.md +60 -495
  155. claude_mpm/commands/mpm-version.md +13 -107
  156. claude_mpm/commands/mpm.md +8 -0
  157. claude_mpm/config/agent_presets.py +8 -7
  158. claude_mpm/config/agent_sources.py +27 -0
  159. claude_mpm/config/skill_sources.py +16 -0
  160. claude_mpm/constants.py +1 -0
  161. claude_mpm/core/claude_runner.py +154 -2
  162. claude_mpm/core/config.py +37 -26
  163. claude_mpm/core/config_constants.py +74 -9
  164. claude_mpm/core/constants.py +56 -12
  165. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  166. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  167. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  168. claude_mpm/core/framework_loader.py +4 -2
  169. claude_mpm/core/hook_manager.py +51 -3
  170. claude_mpm/core/interactive_session.py +12 -11
  171. claude_mpm/core/logger.py +39 -9
  172. claude_mpm/core/logging_utils.py +35 -11
  173. claude_mpm/core/network_config.py +148 -0
  174. claude_mpm/core/oneshot_session.py +7 -6
  175. claude_mpm/core/optimized_startup.py +61 -0
  176. claude_mpm/core/output_style_manager.py +219 -44
  177. claude_mpm/core/shared/config_loader.py +3 -1
  178. claude_mpm/core/socketio_pool.py +16 -8
  179. claude_mpm/core/unified_agent_registry.py +134 -16
  180. claude_mpm/core/unified_config.py +76 -8
  181. claude_mpm/core/unified_paths.py +95 -90
  182. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  236. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  237. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  238. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  239. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  240. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  241. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  242. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  248. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  249. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  250. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  251. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  252. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  253. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  254. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  255. claude_mpm/experimental/cli_enhancements.py +2 -1
  256. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  257. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  258. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  259. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  260. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  261. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  262. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  267. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  268. claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
  269. claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
  270. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  271. claude_mpm/hooks/claude_hooks/installer.py +149 -18
  272. claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
  273. claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
  274. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  275. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  276. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  277. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  278. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  279. claude_mpm/hooks/claude_hooks/services/connection_manager.py +69 -30
  280. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  281. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  282. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
  283. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  284. claude_mpm/hooks/memory_integration_hook.py +46 -1
  285. claude_mpm/hooks/session_resume_hook.py +89 -1
  286. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  287. claude_mpm/init.py +276 -19
  288. claude_mpm/models/agent_definition.py +7 -0
  289. claude_mpm/models/git_repository.py +3 -3
  290. claude_mpm/scripts/claude-hook-handler.sh +87 -20
  291. claude_mpm/scripts/launch_monitor.py +93 -13
  292. claude_mpm/scripts/start_activity_logging.py +0 -0
  293. claude_mpm/services/agents/agent_builder.py +3 -3
  294. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  295. claude_mpm/services/agents/agent_review_service.py +280 -0
  296. claude_mpm/services/agents/agent_selection_service.py +2 -2
  297. claude_mpm/services/agents/cache_git_manager.py +7 -7
  298. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  299. claude_mpm/services/agents/deployment/agent_discovery_service.py +6 -5
  300. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  301. claude_mpm/services/agents/deployment/agent_template_builder.py +42 -20
  302. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  303. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  304. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  305. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  306. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +348 -29
  307. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
  308. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  309. claude_mpm/services/agents/git_source_manager.py +57 -4
  310. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  311. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  312. claude_mpm/services/agents/recommender.py +5 -3
  313. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  314. claude_mpm/services/agents/sources/git_source_sync_service.py +129 -11
  315. claude_mpm/services/agents/startup_sync.py +27 -4
  316. claude_mpm/services/agents/toolchain_detector.py +10 -6
  317. claude_mpm/services/analysis/__init__.py +11 -1
  318. claude_mpm/services/analysis/clone_detector.py +1030 -0
  319. claude_mpm/services/cli/__init__.py +3 -0
  320. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  321. claude_mpm/services/cli/session_resume_helper.py +10 -2
  322. claude_mpm/services/command_deployment_service.py +81 -10
  323. claude_mpm/services/delegation_detector.py +175 -0
  324. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  325. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  326. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  327. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  328. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  329. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  330. claude_mpm/services/diagnostics/models.py +14 -1
  331. claude_mpm/services/event_bus/config.py +3 -1
  332. claude_mpm/services/event_log.py +325 -0
  333. claude_mpm/services/git/git_operations_service.py +101 -16
  334. claude_mpm/services/infrastructure/__init__.py +4 -0
  335. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  336. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  337. claude_mpm/services/monitor/daemon.py +9 -2
  338. claude_mpm/services/monitor/daemon_manager.py +54 -7
  339. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  340. claude_mpm/services/monitor/server.py +796 -30
  341. claude_mpm/services/pm_skills_deployer.py +884 -0
  342. claude_mpm/services/profile_manager.py +337 -0
  343. claude_mpm/services/project/project_organizer.py +4 -0
  344. claude_mpm/services/self_upgrade_service.py +120 -12
  345. claude_mpm/services/skills/__init__.py +3 -0
  346. claude_mpm/services/skills/git_skill_source_manager.py +303 -12
  347. claude_mpm/services/skills/selective_skill_deployer.py +869 -0
  348. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  349. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  350. claude_mpm/services/skills_deployer.py +294 -55
  351. claude_mpm/services/socketio/dashboard_server.py +1 -0
  352. claude_mpm/services/socketio/event_normalizer.py +51 -6
  353. claude_mpm/services/socketio/handlers/hook.py +14 -7
  354. claude_mpm/services/socketio/server/core.py +386 -108
  355. claude_mpm/services/socketio/server/main.py +12 -4
  356. claude_mpm/services/version_control/git_operations.py +103 -0
  357. claude_mpm/skills/__init__.py +2 -1
  358. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  359. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  360. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  361. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  362. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  363. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  364. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  365. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  366. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  367. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  368. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  369. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  370. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  371. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  372. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  373. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  374. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  375. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  376. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  377. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  378. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  379. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  380. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  381. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  382. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  383. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  384. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  385. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  386. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  387. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  388. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  389. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  390. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  391. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  392. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  393. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  394. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  395. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  396. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  397. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  398. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  399. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  400. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  401. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  402. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  403. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  404. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  405. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  406. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  407. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  408. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  409. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  410. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  411. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  412. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  413. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  414. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  415. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  416. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  417. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  418. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  419. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  420. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  422. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  423. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  424. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  425. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  426. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  427. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  428. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  429. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  430. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  431. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  432. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  433. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  434. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  435. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  436. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  437. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  438. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  439. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  440. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  441. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  442. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  443. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  444. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  445. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  446. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  447. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  448. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  449. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  450. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  451. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  459. claude_mpm/skills/bundled/security-scanning.md +112 -0
  460. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  461. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  462. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  463. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  464. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  465. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  466. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  467. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  468. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  469. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  470. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  495. claude_mpm/skills/registry.py +295 -90
  496. claude_mpm/skills/skill_manager.py +98 -3
  497. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  498. claude_mpm/utils/agent_dependency_loader.py +115 -4
  499. claude_mpm/utils/agent_filters.py +17 -44
  500. claude_mpm/utils/gitignore.py +3 -0
  501. claude_mpm/utils/migration.py +4 -4
  502. claude_mpm/utils/robust_installer.py +86 -21
  503. claude_mpm-5.6.23.dist-info/METADATA +393 -0
  504. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
  505. claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
  506. claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
  507. claude_mpm-5.6.23.dist-info/licenses/LICENSE-FAQ.md +153 -0
  508. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  509. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  510. claude_mpm/agents/BASE_OPS.md +0 -219
  511. claude_mpm/agents/BASE_PM.md +0 -480
  512. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  513. claude_mpm/agents/BASE_QA.md +0 -167
  514. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  515. claude_mpm/agents/OUTPUT_STYLE.md +0 -290
  516. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
  517. claude_mpm/agents/base_agent_loader.py +0 -601
  518. claude_mpm/cli/commands/agents_detect.py +0 -380
  519. claude_mpm/cli/commands/agents_recommend.py +0 -309
  520. claude_mpm/cli/ticket_cli.py +0 -35
  521. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  522. claude_mpm/commands/mpm-agents-detect.md +0 -177
  523. claude_mpm/commands/mpm-agents-list.md +0 -131
  524. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  525. claude_mpm/commands/mpm-config-view.md +0 -150
  526. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  527. claude_mpm/dashboard/analysis_runner.py +0 -455
  528. claude_mpm/dashboard/index.html +0 -13
  529. claude_mpm/dashboard/open_dashboard.py +0 -66
  530. claude_mpm/dashboard/static/css/activity.css +0 -1958
  531. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  532. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  533. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  534. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  535. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  536. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  537. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  538. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  539. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  540. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  541. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  542. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  543. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  544. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  545. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  546. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  547. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  548. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  549. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  550. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  551. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  552. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  553. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  554. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  555. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  556. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  557. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  558. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  559. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  560. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  561. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  562. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  563. claude_mpm/dashboard/templates/code_simple.html +0 -153
  564. claude_mpm/dashboard/templates/index.html +0 -606
  565. claude_mpm/dashboard/test_dashboard.html +0 -372
  566. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  567. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  568. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  569. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  570. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  571. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  572. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  573. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  574. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  575. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  576. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  577. claude_mpm/scripts/mcp_server.py +0 -75
  578. claude_mpm/scripts/mcp_wrapper.py +0 -39
  579. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  580. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  581. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  582. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  583. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  584. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  585. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  586. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  587. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  588. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  589. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  590. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  591. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  592. claude_mpm/services/mcp_gateway/main.py +0 -589
  593. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  594. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  595. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  596. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  597. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  598. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  599. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  600. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  601. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  602. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  603. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  604. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  605. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  606. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  607. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  608. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  609. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  610. claude_mpm-5.0.9.dist-info/METADATA +0 -1028
  611. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  612. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  613. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
  614. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
@@ -1,724 +0,0 @@
1
- /**
2
- * File and Tool Tracker Module
3
- *
4
- * Tracks file operations and tool calls by pairing pre/post events and maintaining
5
- * organized collections for the files and tools tabs. Provides analysis of
6
- * tool execution patterns and file operation history.
7
- *
8
- * WHY: Extracted from main dashboard to isolate complex event pairing logic
9
- * that groups related events into meaningful operations. This provides better
10
- * maintainability for the intricate logic of matching tool events with their results.
11
- *
12
- * DESIGN DECISION: Uses intelligent correlation strategy for tool calls that:
13
- * - Separates pre_tool and post_tool events first
14
- * - Correlates based on temporal proximity, parameter similarity, and context
15
- * - Handles timing differences between pre/post events (tools can run for minutes)
16
- * - Prevents duplicate tool entries by ensuring each tool call appears once
17
- * - Supports both paired and orphaned events for comprehensive tracking
18
- */
19
- class FileToolTracker {
20
- constructor(agentInference, workingDirectoryManager) {
21
- this.agentInference = agentInference;
22
- this.workingDirectoryManager = workingDirectoryManager;
23
-
24
- // File tracking for files tab
25
- this.fileOperations = new Map(); // Map of file paths to operations
26
-
27
- // Tool call tracking for tools tab
28
- this.toolCalls = new Map(); // Map of tool call keys to paired pre/post events
29
-
30
- console.log('File-tool tracker initialized');
31
- }
32
-
33
- /**
34
- * Update file operations from events
35
- * @param {Array} events - Events to process
36
- */
37
- updateFileOperations(events) {
38
- // Clear existing data
39
- this.fileOperations.clear();
40
-
41
- console.log('updateFileOperations - processing', events.length, 'events');
42
-
43
- // Group events by session and timestamp to match pre/post pairs
44
- const eventPairs = new Map(); // Key: session_id + timestamp + tool_name
45
- let fileOperationCount = 0;
46
-
47
- // First pass: collect all tool events and group them
48
- events.forEach((event, index) => {
49
- const isFileOp = this.isFileOperation(event);
50
- if (isFileOp) fileOperationCount++;
51
-
52
- if (index < 5) { // Debug first 5 events with more detail
53
- console.log(`Event ${index}:`, {
54
- type: event.type,
55
- subtype: event.subtype,
56
- tool_name: event.tool_name,
57
- tool_parameters: event.tool_parameters,
58
- isFileOp: isFileOp
59
- });
60
- }
61
-
62
- if (isFileOp) {
63
- const toolName = event.tool_name || (event.data && event.data.tool_name);
64
- const sessionId = event.session_id || (event.data && event.data.session_id) || 'unknown';
65
- const eventKey = `${sessionId}_${toolName}_${Math.floor(new Date(event.timestamp).getTime() / 1000)}`; // Group by second
66
-
67
- if (!eventPairs.has(eventKey)) {
68
- eventPairs.set(eventKey, {
69
- pre_event: null,
70
- post_event: null,
71
- tool_name: toolName,
72
- session_id: sessionId
73
- });
74
- }
75
-
76
- const pair = eventPairs.get(eventKey);
77
- if (event.subtype === 'pre_tool' || (event.type === 'hook' && event.subtype && !event.subtype.includes('post'))) {
78
- pair.pre_event = event;
79
- } else if (event.subtype === 'post_tool' || (event.subtype && event.subtype.includes('post'))) {
80
- pair.post_event = event;
81
- } else {
82
- // For events without clear pre/post distinction, treat as both
83
- pair.pre_event = event;
84
- pair.post_event = event;
85
- }
86
- }
87
- });
88
-
89
- console.log('updateFileOperations - found', fileOperationCount, 'file operations in', eventPairs.size, 'event pairs');
90
-
91
- // Second pass: extract file paths and operations from paired events
92
- eventPairs.forEach((pair, key) => {
93
- const filePath = this.extractFilePathFromPair(pair);
94
-
95
- if (filePath) {
96
- console.log('File operation detected for:', filePath, 'from pair:', key);
97
-
98
- if (!this.fileOperations.has(filePath)) {
99
- this.fileOperations.set(filePath, {
100
- path: filePath,
101
- operations: [],
102
- lastOperation: null
103
- });
104
- }
105
-
106
- const fileData = this.fileOperations.get(filePath);
107
- const operation = this.getFileOperationFromPair(pair);
108
- const timestamp = pair.post_event?.timestamp || pair.pre_event?.timestamp;
109
-
110
- const agentInfo = this.extractAgentFromPair(pair);
111
- const workingDirectory = this.workingDirectoryManager.extractWorkingDirectoryFromPair(pair);
112
-
113
- fileData.operations.push({
114
- operation: operation,
115
- timestamp: timestamp,
116
- agent: agentInfo.name,
117
- confidence: agentInfo.confidence,
118
- sessionId: pair.session_id,
119
- details: this.getFileOperationDetailsFromPair(pair),
120
- workingDirectory: workingDirectory
121
- });
122
- fileData.lastOperation = timestamp;
123
- } else {
124
- console.log('No file path found for pair:', key, pair);
125
- }
126
- });
127
-
128
- console.log('updateFileOperations - final result:', this.fileOperations.size, 'file operations');
129
- if (this.fileOperations.size > 0) {
130
- console.log('File operations map:', Array.from(this.fileOperations.entries()));
131
- }
132
- }
133
-
134
- /**
135
- * Update tool calls from events - pairs pre/post tool events into complete tool calls
136
- * @param {Array} events - Events to process
137
- */
138
- updateToolCalls(events) {
139
- // Clear existing data
140
- this.toolCalls.clear();
141
-
142
- console.log('updateToolCalls - processing', events.length, 'events');
143
-
144
- // Improved correlation strategy: collect events first, then correlate intelligently
145
- const preToolEvents = [];
146
- const postToolEvents = [];
147
- let toolOperationCount = 0;
148
-
149
- // First pass: separate pre_tool and post_tool events
150
- events.forEach((event, index) => {
151
- const isToolOp = this.isToolOperation(event);
152
- if (isToolOp) toolOperationCount++;
153
-
154
- if (index < 5) { // Debug first 5 events with more detail
155
- console.log(`Tool Event ${index}:`, {
156
- type: event.type,
157
- subtype: event.subtype,
158
- tool_name: event.tool_name,
159
- tool_parameters: event.tool_parameters,
160
- isToolOp: isToolOp
161
- });
162
- }
163
-
164
- if (isToolOp) {
165
- if (event.subtype === 'pre_tool' || (event.type === 'hook' && event.subtype && !event.subtype.includes('post'))) {
166
- preToolEvents.push(event);
167
- } else if (event.subtype === 'post_tool' || (event.subtype && event.subtype.includes('post'))) {
168
- postToolEvents.push(event);
169
- } else {
170
- // For events without clear pre/post distinction, treat as standalone
171
- preToolEvents.push(event);
172
- postToolEvents.push(event);
173
- }
174
- }
175
- });
176
-
177
- console.log('updateToolCalls - found', toolOperationCount, 'tool operations:', preToolEvents.length, 'pre_tool,', postToolEvents.length, 'post_tool');
178
-
179
- // Second pass: correlate pre_tool events with post_tool events
180
- const toolCallPairs = new Map();
181
- const usedPostEvents = new Set();
182
-
183
- preToolEvents.forEach((preEvent, preIndex) => {
184
- const toolName = preEvent.tool_name || (preEvent.data && preEvent.data.tool_name);
185
- const sessionId = preEvent.session_id || (preEvent.data && preEvent.data.session_id) || 'unknown';
186
- const preTimestamp = new Date(preEvent.timestamp).getTime();
187
-
188
- // Create a base pair for this pre_tool event
189
- const pairKey = `${sessionId}_${toolName}_${preIndex}_${preTimestamp}`;
190
- const pair = {
191
- pre_event: preEvent,
192
- post_event: null,
193
- tool_name: toolName,
194
- session_id: sessionId,
195
- operation_type: preEvent.operation_type || 'tool_execution',
196
- timestamp: preEvent.timestamp,
197
- duration_ms: null,
198
- success: null,
199
- exit_code: null,
200
- result_summary: null,
201
- agent_type: null,
202
- agent_confidence: null
203
- };
204
-
205
- // Get agent info from pre_event
206
- const agentInfo = this.extractAgentFromEvent(preEvent);
207
- pair.agent_type = agentInfo.name;
208
- pair.agent_confidence = agentInfo.confidence;
209
-
210
- // Try to find matching post_tool event
211
- let bestMatchIndex = -1;
212
- let bestMatchScore = -1;
213
- const maxTimeDiffMs = 300000; // 5 minutes max time difference
214
-
215
- postToolEvents.forEach((postEvent, postIndex) => {
216
- // Skip already used post events
217
- if (usedPostEvents.has(postIndex)) return;
218
-
219
- // Must match tool name and session
220
- const postToolName = postEvent.tool_name || (postEvent.data && postEvent.data.tool_name);
221
- const postSessionId = postEvent.session_id || (postEvent.data && postEvent.data.session_id) || 'unknown';
222
- if (postToolName !== toolName || postSessionId !== sessionId) return;
223
-
224
- const postTimestamp = new Date(postEvent.timestamp).getTime();
225
- const timeDiff = Math.abs(postTimestamp - preTimestamp);
226
-
227
- // Post event should generally come after pre event (or very close)
228
- const isTemporallyValid = postTimestamp >= preTimestamp - 1000; // Allow 1s clock skew
229
-
230
- // Calculate correlation score (higher is better)
231
- let score = 0;
232
- if (isTemporallyValid && timeDiff <= maxTimeDiffMs) {
233
- score = 1000 - (timeDiff / 1000); // Prefer closer timestamps
234
-
235
- // Boost score for parameter similarity (if available)
236
- if (this.compareToolParameters(preEvent, postEvent)) {
237
- score += 500;
238
- }
239
-
240
- // Boost score for same working directory
241
- if (preEvent.working_directory && postEvent.working_directory &&
242
- preEvent.working_directory === postEvent.working_directory) {
243
- score += 100;
244
- }
245
- }
246
-
247
- if (score > bestMatchScore) {
248
- bestMatchScore = score;
249
- bestMatchIndex = postIndex;
250
- }
251
- });
252
-
253
- // If we found a good match, pair them
254
- if (bestMatchIndex >= 0 && bestMatchScore > 0) {
255
- const postEvent = postToolEvents[bestMatchIndex];
256
- pair.post_event = postEvent;
257
- pair.duration_ms = postEvent.duration_ms;
258
- pair.success = postEvent.success;
259
- pair.exit_code = postEvent.exit_code;
260
- pair.result_summary = postEvent.result_summary;
261
-
262
- usedPostEvents.add(bestMatchIndex);
263
- console.log(`Paired pre_tool ${toolName} at ${preEvent.timestamp} with post_tool at ${postEvent.timestamp} (score: ${bestMatchScore})`);
264
- } else {
265
- console.log(`No matching post_tool found for ${toolName} at ${preEvent.timestamp} (still running or orphaned)`);
266
- }
267
-
268
- toolCallPairs.set(pairKey, pair);
269
- });
270
-
271
- // Third pass: handle any orphaned post_tool events (shouldn't happen but be safe)
272
- postToolEvents.forEach((postEvent, postIndex) => {
273
- if (usedPostEvents.has(postIndex)) return;
274
-
275
- const toolName = postEvent.tool_name || (postEvent.data && postEvent.data.tool_name);
276
- console.log('Orphaned post_tool event found:', toolName, 'at', postEvent.timestamp);
277
-
278
- const sessionId = postEvent.session_id || (postEvent.data && postEvent.data.session_id) || 'unknown';
279
- const postTimestamp = new Date(postEvent.timestamp).getTime();
280
-
281
- const pairKey = `orphaned_${sessionId}_${toolName}_${postIndex}_${postTimestamp}`;
282
- const pair = {
283
- pre_event: null,
284
- post_event: postEvent,
285
- tool_name: toolName,
286
- session_id: sessionId,
287
- operation_type: 'tool_execution',
288
- timestamp: postEvent.timestamp,
289
- duration_ms: postEvent.duration_ms,
290
- success: postEvent.success,
291
- exit_code: postEvent.exit_code,
292
- result_summary: postEvent.result_summary,
293
- agent_type: null,
294
- agent_confidence: null
295
- };
296
-
297
- const agentInfo = this.extractAgentFromEvent(postEvent);
298
- pair.agent_type = agentInfo.name;
299
- pair.agent_confidence = agentInfo.confidence;
300
-
301
- toolCallPairs.set(pairKey, pair);
302
- });
303
-
304
- // Store the correlated tool calls
305
- this.toolCalls = toolCallPairs;
306
-
307
- console.log('updateToolCalls - final result:', this.toolCalls.size, 'tool calls');
308
- if (this.toolCalls.size > 0) {
309
- console.log('Tool calls map keys:', Array.from(this.toolCalls.keys()));
310
- }
311
- }
312
-
313
- /**
314
- * Check if event is a tool operation
315
- * @param {Object} event - Event to check
316
- * @returns {boolean} - True if tool operation
317
- */
318
- isToolOperation(event) {
319
- // Tool operations have tool_name - be more inclusive about event types
320
- // Check both top-level and data.tool_name for compatibility
321
- const hasToolName = event.tool_name || (event.data && event.data.tool_name);
322
-
323
- // Accept multiple event types that might contain tool operations
324
- const validEventTypes = ['hook', 'tool_use', 'tool', 'agent', 'response'];
325
- const isValidEventType = validEventTypes.includes(event.type) ||
326
- (event.type && event.type.includes('tool'));
327
-
328
- // Check for tool-related subtypes or any indication this is a tool operation
329
- const isToolSubtype = event.subtype === 'pre_tool' ||
330
- event.subtype === 'post_tool' ||
331
- (event.subtype && typeof event.subtype === 'string' && event.subtype.includes('tool')) ||
332
- event.type === 'tool_use' ||
333
- event.type === 'tool';
334
-
335
- // If it has a tool_name and either a valid event type or tool subtype, it's a tool operation
336
- return hasToolName && (isValidEventType || isToolSubtype);
337
- }
338
-
339
- /**
340
- * Check if event is a file operation
341
- * @param {Object} event - Event to check
342
- * @returns {boolean} - True if file operation
343
- */
344
- isFileOperation(event) {
345
- // File operations are events with file-related tools - be more inclusive
346
- // Check both top-level and data for tool_name
347
- let toolName = event.tool_name || (event.data && event.data.tool_name) || '';
348
-
349
- // If no tool name, not a file operation
350
- if (!toolName) {
351
- return false;
352
- }
353
-
354
- toolName = toolName.toLowerCase();
355
-
356
- // Check case-insensitively since tool names can come in different cases
357
- const fileTools = ['read', 'write', 'edit', 'grep', 'multiedit', 'glob', 'ls', 'bash', 'notebookedit'];
358
-
359
- // Get tool parameters from either location
360
- const toolParams = event.tool_parameters || (event.data && event.data.tool_parameters);
361
-
362
- // Also check if Bash commands involve file operations
363
- if (toolName === 'bash' && toolParams) {
364
- const command = toolParams.command || '';
365
- // Check for common file operations in bash commands
366
- if (command.match(/\b(cat|less|more|head|tail|touch|mv|cp|rm|mkdir|ls|find)\b/)) {
367
- return true;
368
- }
369
- }
370
-
371
- // If it's a file tool, it's a file operation regardless of event type
372
- return fileTools.includes(toolName);
373
- }
374
-
375
- /**
376
- * Extract file path from event
377
- * @param {Object} event - Event to extract from
378
- * @returns {string|null} - File path or null
379
- */
380
- extractFilePath(event) {
381
- // Debug logging for file path extraction
382
- const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
383
- const toolName = event.tool_name || (event.data && event.data.tool_name);
384
-
385
- if (fileTools.includes(toolName)) {
386
- console.log('Extracting file path from event:', {
387
- tool_name: toolName,
388
- has_tool_parameters_top: !!event.tool_parameters,
389
- has_tool_parameters_data: !!(event.data && event.data.tool_parameters),
390
- tool_parameters: event.tool_parameters,
391
- data_tool_parameters: event.data?.tool_parameters
392
- });
393
- }
394
-
395
- // Try various locations where file path might be stored
396
- // Check top-level tool_parameters first (after transformation)
397
- if (event.tool_parameters?.file_path) return event.tool_parameters.file_path;
398
- if (event.tool_parameters?.path) return event.tool_parameters.path;
399
- if (event.tool_parameters?.notebook_path) return event.tool_parameters.notebook_path;
400
-
401
- // Check in data object as fallback
402
- if (event.data?.tool_parameters?.file_path) return event.data.tool_parameters.file_path;
403
- if (event.data?.tool_parameters?.path) return event.data.tool_parameters.path;
404
- if (event.data?.tool_parameters?.notebook_path) return event.data.tool_parameters.notebook_path;
405
- if (event.file_path) return event.file_path;
406
- if (event.path) return event.path;
407
-
408
- // For Glob tool, use the pattern as a pseudo-path
409
- if (event.tool_name?.toLowerCase() === 'glob' && event.tool_parameters?.pattern) {
410
- return `[glob] ${event.tool_parameters.pattern}`;
411
- }
412
-
413
- // For Bash commands, try to extract file paths from the command
414
- if (event.tool_name?.toLowerCase() === 'bash' && event.tool_parameters?.command) {
415
- const command = event.tool_parameters.command;
416
-
417
- // Enhanced regex to handle commands with flags
418
- // Match command followed by optional flags (starting with -) and then the file path
419
- // Patterns to handle:
420
- // 1. tail -50 /path/to/file
421
- // 2. head -n 100 /path/to/file
422
- // 3. cat /path/to/file
423
- // 4. grep -r "pattern" /path/to/file
424
- const fileMatch = command.match(/(?:cat|less|more|head|tail|touch|mv|cp|rm|mkdir|ls|find|echo.*>|sed|awk|grep)(?:\s+-[a-zA-Z0-9]+)*(?:\s+[0-9]+)*\s+([^\s;|&]+)/);
425
-
426
- // If first match might be a flag, try a more specific pattern
427
- if (fileMatch && fileMatch[1]) {
428
- const possiblePath = fileMatch[1];
429
- // Check if it's actually a flag (starts with -)
430
- if (possiblePath.startsWith('-')) {
431
- // Try alternative pattern that skips all flags
432
- const altMatch = command.match(/(?:cat|less|more|head|tail|touch|mv|cp|rm|mkdir|ls|find|echo.*>|sed|awk|grep)(?:\s+-[^\s]+)*\s+([^-][^\s;|&]*)/);
433
- if (altMatch && altMatch[1]) {
434
- return altMatch[1];
435
- }
436
- }
437
- return possiblePath;
438
- }
439
- }
440
-
441
- return null;
442
- }
443
-
444
- /**
445
- * Extract file path from event pair
446
- * @param {Object} pair - Event pair object
447
- * @returns {string|null} - File path or null
448
- */
449
- extractFilePathFromPair(pair) {
450
- // Try pre_event first, then post_event
451
- let filePath = null;
452
-
453
- if (pair.pre_event) {
454
- filePath = this.extractFilePath(pair.pre_event);
455
- }
456
-
457
- if (!filePath && pair.post_event) {
458
- filePath = this.extractFilePath(pair.post_event);
459
- }
460
-
461
- return filePath;
462
- }
463
-
464
- /**
465
- * Get file operation type from event
466
- * @param {Object} event - Event to analyze
467
- * @returns {string} - Operation type
468
- */
469
- getFileOperation(event) {
470
- if (!event.tool_name) return 'unknown';
471
-
472
- const toolName = event.tool_name.toLowerCase();
473
- switch (toolName) {
474
- case 'read': return 'read';
475
- case 'write': return 'write';
476
- case 'edit': return 'edit';
477
- case 'multiedit': return 'edit';
478
- case 'notebookedit': return 'edit';
479
- case 'grep': return 'search';
480
- case 'glob': return 'search';
481
- case 'ls': return 'list';
482
- case 'bash':
483
- // Check bash command for file operation type
484
- const command = event.tool_parameters?.command || '';
485
- if (command.match(/\b(cat|less|more|head|tail)\b/)) return 'read';
486
- if (command.match(/\b(touch|echo.*>|tee)\b/)) return 'write';
487
- if (command.match(/\b(sed|awk)\b/)) return 'edit';
488
- if (command.match(/\b(grep|find)\b/)) return 'search';
489
- if (command.match(/\b(ls|dir)\b/)) return 'list';
490
- if (command.match(/\b(mv|cp)\b/)) return 'copy/move';
491
- if (command.match(/\b(rm|rmdir)\b/)) return 'delete';
492
- if (command.match(/\b(mkdir)\b/)) return 'create';
493
- return 'bash';
494
- default: return toolName;
495
- }
496
- }
497
-
498
- /**
499
- * Get file operation from event pair
500
- * @param {Object} pair - Event pair object
501
- * @returns {string} - Operation type
502
- */
503
- getFileOperationFromPair(pair) {
504
- // Try pre_event first, then post_event
505
- if (pair.pre_event) {
506
- return this.getFileOperation(pair.pre_event);
507
- }
508
-
509
- if (pair.post_event) {
510
- return this.getFileOperation(pair.post_event);
511
- }
512
-
513
- return 'unknown';
514
- }
515
-
516
- /**
517
- * Extract agent information from event pair
518
- * @param {Object} pair - Event pair object
519
- * @returns {Object} - Agent info with name and confidence
520
- */
521
- extractAgentFromPair(pair) {
522
- // Try to get agent info from inference system first
523
- const event = pair.pre_event || pair.post_event;
524
- if (event && this.agentInference) {
525
- const inference = this.agentInference.getInferredAgentForEvent(event);
526
- if (inference) {
527
- return {
528
- name: inference.agentName || 'Unknown',
529
- confidence: inference.confidence || 'unknown'
530
- };
531
- }
532
- }
533
-
534
- // Fallback to direct event properties
535
- const agentName = event?.agent_type || event?.subagent_type ||
536
- pair.pre_event?.agent_type || pair.post_event?.agent_type || 'PM';
537
-
538
- return {
539
- name: agentName,
540
- confidence: 'direct'
541
- };
542
- }
543
-
544
- /**
545
- * Get detailed operation information from event pair
546
- * @param {Object} pair - Event pair object
547
- * @returns {Object} - Operation details
548
- */
549
- getFileOperationDetailsFromPair(pair) {
550
- const details = {};
551
-
552
- // Extract details from pre_event (parameters)
553
- if (pair.pre_event) {
554
- const params = pair.pre_event.tool_parameters || pair.pre_event.data?.tool_parameters || {};
555
- details.parameters = params;
556
- details.tool_input = pair.pre_event.tool_input;
557
- }
558
-
559
- // Extract details from post_event (results)
560
- if (pair.post_event) {
561
- details.result = pair.post_event.result;
562
- details.success = pair.post_event.success;
563
- details.error = pair.post_event.error;
564
- details.exit_code = pair.post_event.exit_code;
565
- details.duration_ms = pair.post_event.duration_ms;
566
- }
567
-
568
- return details;
569
- }
570
-
571
- /**
572
- * Get file operations map
573
- * @returns {Map} - File operations map
574
- */
575
- getFileOperations() {
576
- return this.fileOperations;
577
- }
578
-
579
- /**
580
- * Get tool calls map
581
- * @returns {Map} - Tool calls map
582
- */
583
- getToolCalls() {
584
- return this.toolCalls;
585
- }
586
-
587
- /**
588
- * Get tool calls as array for unique instance view
589
- * Each entry represents a unique tool call instance
590
- * @returns {Array} - Array of [key, toolCall] pairs
591
- */
592
- getToolCallsArray() {
593
- return Array.from(this.toolCalls.entries());
594
- }
595
-
596
- /**
597
- * Get file operations for a specific file
598
- * @param {string} filePath - File path
599
- * @returns {Object|null} - File operations data or null
600
- */
601
- getFileOperationsForFile(filePath) {
602
- return this.fileOperations.get(filePath) || null;
603
- }
604
-
605
- /**
606
- * Get tool call by key
607
- * @param {string} key - Tool call key
608
- * @returns {Object|null} - Tool call data or null
609
- */
610
- getToolCall(key) {
611
- return this.toolCalls.get(key) || null;
612
- }
613
-
614
- /**
615
- * Clear all tracking data
616
- */
617
- clear() {
618
- this.fileOperations.clear();
619
- this.toolCalls.clear();
620
- console.log('File-tool tracker cleared');
621
- }
622
-
623
- /**
624
- * Get statistics about tracked operations
625
- * @returns {Object} - Statistics
626
- */
627
- getStatistics() {
628
- return {
629
- fileOperations: this.fileOperations.size,
630
- toolCalls: this.toolCalls.size,
631
- uniqueFiles: this.fileOperations.size,
632
- totalFileOperations: Array.from(this.fileOperations.values())
633
- .reduce((sum, data) => sum + data.operations.length, 0)
634
- };
635
- }
636
-
637
- /**
638
- * Compare tool parameters between pre_tool and post_tool events
639
- * to determine if they're likely from the same tool call
640
- * @param {Object} preEvent - Pre-tool event
641
- * @param {Object} postEvent - Post-tool event
642
- * @returns {boolean} - True if parameters suggest same tool call
643
- */
644
- compareToolParameters(preEvent, postEvent) {
645
- // Extract parameters from both events
646
- const preParams = preEvent.tool_parameters || preEvent.data?.tool_parameters || {};
647
- const postParams = postEvent.tool_parameters || postEvent.data?.tool_parameters || {};
648
-
649
- // If no parameters in either event, can't compare meaningfully
650
- if (Object.keys(preParams).length === 0 && Object.keys(postParams).length === 0) {
651
- return false; // No boost for empty parameters
652
- }
653
-
654
- // Compare key parameters that are likely to be the same
655
- const importantParams = ['file_path', 'path', 'pattern', 'command', 'notebook_path'];
656
- let matchedParams = 0;
657
- let totalComparableParams = 0;
658
-
659
- importantParams.forEach(param => {
660
- const preValue = preParams[param];
661
- const postValue = postParams[param];
662
-
663
- if (preValue !== undefined || postValue !== undefined) {
664
- totalComparableParams++;
665
- if (preValue === postValue) {
666
- matchedParams++;
667
- }
668
- }
669
- });
670
-
671
- // If we found comparable parameters, check if most match
672
- if (totalComparableParams > 0) {
673
- return (matchedParams / totalComparableParams) >= 0.8; // 80% parameter match threshold
674
- }
675
-
676
- // If no important parameters to compare, check if the parameter structure is similar
677
- const preKeys = Object.keys(preParams).sort();
678
- const postKeys = Object.keys(postParams).sort();
679
-
680
- if (preKeys.length === 0 && postKeys.length === 0) {
681
- return false;
682
- }
683
-
684
- // Simple structural similarity check
685
- if (preKeys.length === postKeys.length) {
686
- const keyMatches = preKeys.filter(key => postKeys.includes(key)).length;
687
- return keyMatches >= Math.max(1, preKeys.length * 0.5); // At least 50% key overlap
688
- }
689
-
690
- return false;
691
- }
692
-
693
- /**
694
- * Extract agent information from event using inference system
695
- * @param {Object} event - Event to extract agent from
696
- * @returns {Object} - Agent info with name and confidence
697
- */
698
- extractAgentFromEvent(event) {
699
- if (this.agentInference) {
700
- const inference = this.agentInference.getInferredAgentForEvent(event);
701
- if (inference) {
702
- return {
703
- name: inference.agentName || 'Unknown',
704
- confidence: inference.confidence || 'unknown'
705
- };
706
- }
707
- }
708
-
709
- // Fallback to direct event properties
710
- const agentName = event.agent_type || event.subagent_type ||
711
- event.data?.agent_type || event.data?.subagent_type || 'PM';
712
-
713
- return {
714
- name: agentName,
715
- confidence: 'direct'
716
- };
717
- }
718
- }
719
- // ES6 Module export
720
- export { FileToolTracker };
721
- export default FileToolTracker;
722
-
723
- // Make FileToolTracker globally available for dist/dashboard.js
724
- window.FileToolTracker = FileToolTracker;