@team-agent/installer 0.2.11 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/Cargo.lock +744 -0
  2. package/Cargo.toml +34 -0
  3. package/crates/team-agent/Cargo.toml +33 -0
  4. package/crates/team-agent/src/cli/adapters.rs +1343 -0
  5. package/crates/team-agent/src/cli/diagnose.rs +554 -0
  6. package/crates/team-agent/src/cli/emit.rs +1077 -0
  7. package/crates/team-agent/src/cli/helpers.rs +88 -0
  8. package/crates/team-agent/src/cli/leader.rs +216 -0
  9. package/crates/team-agent/src/cli/mod.rs +1141 -0
  10. package/crates/team-agent/src/cli/profile.rs +306 -0
  11. package/crates/team-agent/src/cli/send.rs +215 -0
  12. package/crates/team-agent/src/cli/status.rs +179 -0
  13. package/crates/team-agent/src/cli/status_port.rs +502 -0
  14. package/crates/team-agent/src/cli/tests/base.rs +616 -0
  15. package/crates/team-agent/src/cli/tests/compile.rs +96 -0
  16. package/crates/team-agent/src/cli/tests/divergence.rs +509 -0
  17. package/crates/team-agent/src/cli/tests/lane_c.rs +333 -0
  18. package/crates/team-agent/src/cli/tests/leader_watch.rs +395 -0
  19. package/crates/team-agent/src/cli/tests/main_preserved.rs +675 -0
  20. package/crates/team-agent/src/cli/tests/missing_subcommands.rs +390 -0
  21. package/crates/team-agent/src/cli/tests/mod.rs +97 -0
  22. package/crates/team-agent/src/cli/tests/peer_allow.rs +137 -0
  23. package/crates/team-agent/src/cli/tests/repair_state_byte_lock.rs +302 -0
  24. package/crates/team-agent/src/cli/tests/run_delegation.rs +305 -0
  25. package/crates/team-agent/src/cli/tests/status_send.rs +385 -0
  26. package/crates/team-agent/src/cli/tests/verb_profile.rs +182 -0
  27. package/crates/team-agent/src/cli/tests/verb_settle.rs +236 -0
  28. package/crates/team-agent/src/cli/tests/verb_validate.rs +184 -0
  29. package/crates/team-agent/src/cli/types.rs +605 -0
  30. package/crates/team-agent/src/compiler/tests.rs +701 -0
  31. package/crates/team-agent/src/compiler.rs +489 -0
  32. package/crates/team-agent/src/coordinator/backoff.rs +153 -0
  33. package/crates/team-agent/src/coordinator/health.rs +436 -0
  34. package/crates/team-agent/src/coordinator/mod.rs +80 -0
  35. package/crates/team-agent/src/coordinator/orphan.rs +179 -0
  36. package/crates/team-agent/src/coordinator/tests/abnormal.rs +255 -0
  37. package/crates/team-agent/src/coordinator/tests/basics.rs +262 -0
  38. package/crates/team-agent/src/coordinator/tests/daemon.rs +323 -0
  39. package/crates/team-agent/src/coordinator/tests/health_sync.rs +263 -0
  40. package/crates/team-agent/src/coordinator/tests/main_preserved.rs +136 -0
  41. package/crates/team-agent/src/coordinator/tests/mod.rs +310 -0
  42. package/crates/team-agent/src/coordinator/tests/spine.rs +261 -0
  43. package/crates/team-agent/src/coordinator/tests/takeover.rs +227 -0
  44. package/crates/team-agent/src/coordinator/tests/tick_core.rs +256 -0
  45. package/crates/team-agent/src/coordinator/tests/watch.rs +167 -0
  46. package/crates/team-agent/src/coordinator/tick.rs +2032 -0
  47. package/crates/team-agent/src/coordinator/types.rs +584 -0
  48. package/crates/team-agent/src/db/migration.rs +716 -0
  49. package/crates/team-agent/src/db/mod.rs +23 -0
  50. package/crates/team-agent/src/db/schema.rs +378 -0
  51. package/crates/team-agent/src/event_log.rs +375 -0
  52. package/crates/team-agent/src/fake_worker.rs +253 -0
  53. package/crates/team-agent/src/leader/helpers.rs +190 -0
  54. package/crates/team-agent/src/leader/inject.rs +33 -0
  55. package/crates/team-agent/src/leader/lease.rs +1063 -0
  56. package/crates/team-agent/src/leader/mod.rs +99 -0
  57. package/crates/team-agent/src/leader/owner_bind.rs +292 -0
  58. package/crates/team-agent/src/leader/rediscover/tests.rs +525 -0
  59. package/crates/team-agent/src/leader/rediscover.rs +1099 -0
  60. package/crates/team-agent/src/leader/start.rs +273 -0
  61. package/crates/team-agent/src/leader/takeover.rs +235 -0
  62. package/crates/team-agent/src/leader/tests/basics.rs +183 -0
  63. package/crates/team-agent/src/leader/tests/byte_findings.rs +234 -0
  64. package/crates/team-agent/src/leader/tests/identity.rs +206 -0
  65. package/crates/team-agent/src/leader/tests/idle.rs +271 -0
  66. package/crates/team-agent/src/leader/tests/lease_api.rs +225 -0
  67. package/crates/team-agent/src/leader/tests/lease_claim.rs +253 -0
  68. package/crates/team-agent/src/leader/tests/mod.rs +125 -0
  69. package/crates/team-agent/src/leader/tests/rediscover.rs +351 -0
  70. package/crates/team-agent/src/leader/tests/wake_start_owner.rs +204 -0
  71. package/crates/team-agent/src/leader/types.rs +487 -0
  72. package/crates/team-agent/src/lib.rs +85 -0
  73. package/crates/team-agent/src/lifecycle/display.rs +228 -0
  74. package/crates/team-agent/src/lifecycle/helpers.rs +112 -0
  75. package/crates/team-agent/src/lifecycle/launch/plan.rs +227 -0
  76. package/crates/team-agent/src/lifecycle/launch.rs +1833 -0
  77. package/crates/team-agent/src/lifecycle/mod.rs +62 -0
  78. package/crates/team-agent/src/lifecycle/restart/agent.rs +533 -0
  79. package/crates/team-agent/src/lifecycle/restart/common.rs +517 -0
  80. package/crates/team-agent/src/lifecycle/restart/orchestrator.rs +41 -0
  81. package/crates/team-agent/src/lifecycle/restart/rebuild.rs +268 -0
  82. package/crates/team-agent/src/lifecycle/restart/remove.rs +780 -0
  83. package/crates/team-agent/src/lifecycle/restart/selection.rs +208 -0
  84. package/crates/team-agent/src/lifecycle/restart/team_state.rs +242 -0
  85. package/crates/team-agent/src/lifecycle/restart.rs +76 -0
  86. package/crates/team-agent/src/lifecycle/tests/agent_ops.rs +455 -0
  87. package/crates/team-agent/src/lifecycle/tests/core.rs +989 -0
  88. package/crates/team-agent/src/lifecycle/tests/lane_ops.rs +583 -0
  89. package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +933 -0
  90. package/crates/team-agent/src/lifecycle/tests/main_preserved.rs +265 -0
  91. package/crates/team-agent/src/lifecycle/tests.rs +27 -0
  92. package/crates/team-agent/src/lifecycle/types.rs +685 -0
  93. package/crates/team-agent/src/main.rs +41 -0
  94. package/crates/team-agent/src/mcp_server/helpers.rs +228 -0
  95. package/crates/team-agent/src/mcp_server/mod.rs +183 -0
  96. package/crates/team-agent/src/mcp_server/normalize.rs +312 -0
  97. package/crates/team-agent/src/mcp_server/tests/golden.rs +283 -0
  98. package/crates/team-agent/src/mcp_server/tests/normalize.rs +244 -0
  99. package/crates/team-agent/src/mcp_server/tests/scoped.rs +189 -0
  100. package/crates/team-agent/src/mcp_server/tests/send.rs +222 -0
  101. package/crates/team-agent/src/mcp_server/tests/tools.rs +158 -0
  102. package/crates/team-agent/src/mcp_server/tests/wire.rs +159 -0
  103. package/crates/team-agent/src/mcp_server/tests.rs +38 -0
  104. package/crates/team-agent/src/mcp_server/tools.rs +603 -0
  105. package/crates/team-agent/src/mcp_server/types.rs +421 -0
  106. package/crates/team-agent/src/mcp_server/wire.rs +388 -0
  107. package/crates/team-agent/src/message_store.rs +767 -0
  108. package/crates/team-agent/src/messaging/activity.rs +433 -0
  109. package/crates/team-agent/src/messaging/delivery.rs +542 -0
  110. package/crates/team-agent/src/messaging/helpers.rs +209 -0
  111. package/crates/team-agent/src/messaging/leader_receiver.rs +340 -0
  112. package/crates/team-agent/src/messaging/mod.rs +147 -0
  113. package/crates/team-agent/src/messaging/peers.rs +32 -0
  114. package/crates/team-agent/src/messaging/results.rs +537 -0
  115. package/crates/team-agent/src/messaging/scheduler.rs +344 -0
  116. package/crates/team-agent/src/messaging/selftest.rs +100 -0
  117. package/crates/team-agent/src/messaging/send.rs +582 -0
  118. package/crates/team-agent/src/messaging/tests/basic.rs +357 -0
  119. package/crates/team-agent/src/messaging/tests/main_preserved.rs +122 -0
  120. package/crates/team-agent/src/messaging/tests/mod.rs +293 -0
  121. package/crates/team-agent/src/messaging/tests/runtime.rs +1422 -0
  122. package/crates/team-agent/src/messaging/tests/spine.rs +437 -0
  123. package/crates/team-agent/src/messaging/trust.rs +192 -0
  124. package/crates/team-agent/src/messaging/types.rs +355 -0
  125. package/crates/team-agent/src/messaging/watchers.rs +591 -0
  126. package/crates/team-agent/src/model/enums.rs +311 -0
  127. package/crates/team-agent/src/model/errors.rs +17 -0
  128. package/crates/team-agent/src/model/ids.rs +155 -0
  129. package/crates/team-agent/src/model/mod.rs +22 -0
  130. package/crates/team-agent/src/model/paths.rs +228 -0
  131. package/crates/team-agent/src/model/permissions.rs +567 -0
  132. package/crates/team-agent/src/model/routing.rs +340 -0
  133. package/crates/team-agent/src/model/spec.rs +680 -0
  134. package/crates/team-agent/src/model/task_graph.rs +380 -0
  135. package/crates/team-agent/src/model/testdata/fuzz.golden.yaml +43 -0
  136. package/crates/team-agent/src/model/testdata/fuzz.yaml +43 -0
  137. package/crates/team-agent/src/model/testdata/spec_invalid_a.yaml +207 -0
  138. package/crates/team-agent/src/model/testdata/team.spec.golden.yaml +206 -0
  139. package/crates/team-agent/src/model/testdata/team.spec.yaml +206 -0
  140. package/crates/team-agent/src/model/yaml/tests.rs +288 -0
  141. package/crates/team-agent/src/model/yaml.rs +800 -0
  142. package/crates/team-agent/src/packaging/install.rs +305 -0
  143. package/crates/team-agent/src/packaging/migrate.rs +30 -0
  144. package/crates/team-agent/src/packaging/mod.rs +82 -0
  145. package/crates/team-agent/src/packaging/repair.rs +24 -0
  146. package/crates/team-agent/src/packaging/tests.rs +829 -0
  147. package/crates/team-agent/src/packaging/types.rs +369 -0
  148. package/crates/team-agent/src/provider/adapter.rs +801 -0
  149. package/crates/team-agent/src/provider/approvals/mod.rs +2 -0
  150. package/crates/team-agent/src/provider/approvals/parsing.rs +452 -0
  151. package/crates/team-agent/src/provider/approvals/runtime_prompts.rs +163 -0
  152. package/crates/team-agent/src/provider/classify.rs +456 -0
  153. package/crates/team-agent/src/provider/faults.rs +136 -0
  154. package/crates/team-agent/src/provider/helpers.rs +41 -0
  155. package/crates/team-agent/src/provider/mod.rs +53 -0
  156. package/crates/team-agent/src/provider/startup_prompt.rs +423 -0
  157. package/crates/team-agent/src/provider/tests/adapter.rs +239 -0
  158. package/crates/team-agent/src/provider/tests/classify.rs +240 -0
  159. package/crates/team-agent/src/provider/tests/faults.rs +120 -0
  160. package/crates/team-agent/src/provider/tests/idle.rs +208 -0
  161. package/crates/team-agent/src/provider/tests/wire.rs +213 -0
  162. package/crates/team-agent/src/provider/tests.rs +31 -0
  163. package/crates/team-agent/src/provider/types.rs +424 -0
  164. package/crates/team-agent/src/state/identity.rs +656 -0
  165. package/crates/team-agent/src/state/mod.rs +58 -0
  166. package/crates/team-agent/src/state/owner_gate.rs +423 -0
  167. package/crates/team-agent/src/state/persist.rs +712 -0
  168. package/crates/team-agent/src/state/projection.rs +657 -0
  169. package/crates/team-agent/src/state/selector.rs +105 -0
  170. package/crates/team-agent/src/state/testdata/state-rich.canonical.json +133 -0
  171. package/crates/team-agent/src/tmux_backend/tests.rs +586 -0
  172. package/crates/team-agent/src/tmux_backend.rs +758 -0
  173. package/crates/team-agent/src/transport/test_support.rs +252 -0
  174. package/crates/team-agent/src/transport/tests/behavior.rs +327 -0
  175. package/crates/team-agent/src/transport/tests/mod.rs +199 -0
  176. package/crates/team-agent/src/transport/tests/wire.rs +527 -0
  177. package/crates/team-agent/src/transport.rs +774 -0
  178. package/npm/install.mjs +90 -106
  179. package/package.json +15 -13
  180. package/crates/team-agent-core/Cargo.toml +0 -12
  181. package/crates/team-agent-core/src/lib.rs +0 -332
  182. package/crates/team-agent-core/src/main.rs +0 -152
  183. package/pyproject.toml +0 -18
  184. package/scripts/install.py +0 -88
  185. package/scripts/run_regression_tests.py +0 -83
  186. package/src/team_agent/__init__.py +0 -3
  187. package/src/team_agent/__main__.py +0 -5
  188. package/src/team_agent/_legacy_pane_discovery.py +0 -186
  189. package/src/team_agent/abnormal_track.py +0 -253
  190. package/src/team_agent/approvals/__init__.py +0 -65
  191. package/src/team_agent/approvals/constants.py +0 -6
  192. package/src/team_agent/approvals/parsing.py +0 -176
  193. package/src/team_agent/approvals/runtime_prompts.py +0 -171
  194. package/src/team_agent/approvals/status.py +0 -176
  195. package/src/team_agent/cli/__init__.py +0 -137
  196. package/src/team_agent/cli/commands.py +0 -481
  197. package/src/team_agent/cli/e2e.py +0 -202
  198. package/src/team_agent/cli/helpers.py +0 -226
  199. package/src/team_agent/cli/parser.py +0 -540
  200. package/src/team_agent/compiler.py +0 -334
  201. package/src/team_agent/coordinator/__init__.py +0 -53
  202. package/src/team_agent/coordinator/__main__.py +0 -119
  203. package/src/team_agent/coordinator/lifecycle.py +0 -411
  204. package/src/team_agent/coordinator/metadata.py +0 -61
  205. package/src/team_agent/coordinator/paths.py +0 -17
  206. package/src/team_agent/diagnose/__init__.py +0 -48
  207. package/src/team_agent/diagnose/checks.py +0 -101
  208. package/src/team_agent/diagnose/comms.py +0 -213
  209. package/src/team_agent/diagnose/health.py +0 -241
  210. package/src/team_agent/diagnose/orphan_cleanup.py +0 -364
  211. package/src/team_agent/diagnose/preflight.py +0 -194
  212. package/src/team_agent/diagnose/quick_start.py +0 -324
  213. package/src/team_agent/display/__init__.py +0 -92
  214. package/src/team_agent/display/adaptive.py +0 -511
  215. package/src/team_agent/display/backend.py +0 -46
  216. package/src/team_agent/display/close.py +0 -154
  217. package/src/team_agent/display/ghostty.py +0 -77
  218. package/src/team_agent/display/rebuild.py +0 -102
  219. package/src/team_agent/display/tiling.py +0 -156
  220. package/src/team_agent/display/worker_window.py +0 -114
  221. package/src/team_agent/display/workspace.py +0 -382
  222. package/src/team_agent/errors.py +0 -10
  223. package/src/team_agent/events.py +0 -84
  224. package/src/team_agent/fake_worker.py +0 -80
  225. package/src/team_agent/idle_predicate.py +0 -218
  226. package/src/team_agent/idle_takeover.py +0 -59
  227. package/src/team_agent/idle_takeover_wiring.py +0 -114
  228. package/src/team_agent/launch/__init__.py +0 -41
  229. package/src/team_agent/launch/bootstrap.py +0 -85
  230. package/src/team_agent/launch/config.py +0 -106
  231. package/src/team_agent/launch/core.py +0 -301
  232. package/src/team_agent/launch/requirements.py +0 -57
  233. package/src/team_agent/leader/__init__.py +0 -926
  234. package/src/team_agent/leader_binding.py +0 -183
  235. package/src/team_agent/lifecycle/__init__.py +0 -5
  236. package/src/team_agent/lifecycle/agents.py +0 -278
  237. package/src/team_agent/lifecycle/operations.py +0 -411
  238. package/src/team_agent/lifecycle/paste_buffer_hygiene.py +0 -39
  239. package/src/team_agent/lifecycle/start.py +0 -363
  240. package/src/team_agent/mcp_server/__init__.py +0 -42
  241. package/src/team_agent/mcp_server/__main__.py +0 -7
  242. package/src/team_agent/mcp_server/contracts.py +0 -148
  243. package/src/team_agent/mcp_server/normalize.py +0 -257
  244. package/src/team_agent/mcp_server/server.py +0 -150
  245. package/src/team_agent/mcp_server/tools.py +0 -352
  246. package/src/team_agent/message_store/__init__.py +0 -23
  247. package/src/team_agent/message_store/agent_health.py +0 -113
  248. package/src/team_agent/message_store/core.py +0 -497
  249. package/src/team_agent/message_store/leader_notification_log.py +0 -198
  250. package/src/team_agent/message_store/result_watchers.py +0 -251
  251. package/src/team_agent/message_store/schema.py +0 -308
  252. package/src/team_agent/message_store/schema_migration.py +0 -448
  253. package/src/team_agent/messaging/__init__.py +0 -1
  254. package/src/team_agent/messaging/activity_detector.py +0 -262
  255. package/src/team_agent/messaging/delivery.py +0 -504
  256. package/src/team_agent/messaging/deps.py +0 -247
  257. package/src/team_agent/messaging/idle_alerts.py +0 -423
  258. package/src/team_agent/messaging/internal_delivery.py +0 -46
  259. package/src/team_agent/messaging/leader.py +0 -497
  260. package/src/team_agent/messaging/leader_api_errors.py +0 -216
  261. package/src/team_agent/messaging/leader_panes.py +0 -673
  262. package/src/team_agent/messaging/owner_bypass.py +0 -29
  263. package/src/team_agent/messaging/result_delivery.py +0 -539
  264. package/src/team_agent/messaging/results.py +0 -447
  265. package/src/team_agent/messaging/scheduler.py +0 -450
  266. package/src/team_agent/messaging/send.py +0 -532
  267. package/src/team_agent/messaging/session_drift.py +0 -94
  268. package/src/team_agent/messaging/tmux_io.py +0 -506
  269. package/src/team_agent/messaging/tmux_prompt.py +0 -338
  270. package/src/team_agent/messaging/trust_auto_answer.py +0 -52
  271. package/src/team_agent/orchestrator/__init__.py +0 -376
  272. package/src/team_agent/orchestrator/plan.py +0 -122
  273. package/src/team_agent/orchestrator/state.py +0 -128
  274. package/src/team_agent/paths.py +0 -45
  275. package/src/team_agent/permissions.py +0 -123
  276. package/src/team_agent/profiles/__init__.py +0 -82
  277. package/src/team_agent/profiles/constants.py +0 -19
  278. package/src/team_agent/profiles/core.py +0 -407
  279. package/src/team_agent/profiles/helpers.py +0 -69
  280. package/src/team_agent/profiles/provider_env.py +0 -188
  281. package/src/team_agent/profiles/smoke.py +0 -201
  282. package/src/team_agent/provider_cli/__init__.py +0 -43
  283. package/src/team_agent/provider_cli/adapter.py +0 -172
  284. package/src/team_agent/provider_cli/base.py +0 -48
  285. package/src/team_agent/provider_cli/claude.py +0 -503
  286. package/src/team_agent/provider_cli/codex.py +0 -336
  287. package/src/team_agent/provider_cli/copilot.py +0 -8
  288. package/src/team_agent/provider_cli/fake.py +0 -39
  289. package/src/team_agent/provider_cli/gemini.py +0 -95
  290. package/src/team_agent/provider_cli/opencode.py +0 -8
  291. package/src/team_agent/provider_cli/prompt.py +0 -62
  292. package/src/team_agent/provider_cli/registry.py +0 -18
  293. package/src/team_agent/provider_cli/unsupported.py +0 -32
  294. package/src/team_agent/provider_state/README.md +0 -78
  295. package/src/team_agent/provider_state/__init__.py +0 -91
  296. package/src/team_agent/provider_state/claude.py +0 -86
  297. package/src/team_agent/provider_state/codex.py +0 -84
  298. package/src/team_agent/provider_state/common.py +0 -207
  299. package/src/team_agent/provider_state/registry.py +0 -118
  300. package/src/team_agent/providers.py +0 -163
  301. package/src/team_agent/quality_gates.py +0 -104
  302. package/src/team_agent/restart/__init__.py +0 -34
  303. package/src/team_agent/restart/orchestration.py +0 -554
  304. package/src/team_agent/restart/selection.py +0 -89
  305. package/src/team_agent/restart/snapshot.py +0 -70
  306. package/src/team_agent/routing.py +0 -84
  307. package/src/team_agent/runtime.py +0 -1243
  308. package/src/team_agent/rust_core.py +0 -327
  309. package/src/team_agent/sessions/__init__.py +0 -25
  310. package/src/team_agent/sessions/capture.py +0 -144
  311. package/src/team_agent/sessions/inventory.py +0 -44
  312. package/src/team_agent/sessions/resume.py +0 -135
  313. package/src/team_agent/simple_yaml.py +0 -236
  314. package/src/team_agent/spec.py +0 -370
  315. package/src/team_agent/state.py +0 -693
  316. package/src/team_agent/status/__init__.py +0 -63
  317. package/src/team_agent/status/approvals.py +0 -52
  318. package/src/team_agent/status/compact.py +0 -158
  319. package/src/team_agent/status/constants.py +0 -18
  320. package/src/team_agent/status/inbox.py +0 -58
  321. package/src/team_agent/status/peek.py +0 -117
  322. package/src/team_agent/status/queries.py +0 -199
  323. package/src/team_agent/task_graph.py +0 -80
  324. package/src/team_agent/terminal.py +0 -57
  325. package/src/team_agent/wake.py +0 -58
  326. package/src/team_agent/watch/__init__.py +0 -145
@@ -1,171 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import time
4
- from pathlib import Path
5
- from typing import Any
6
-
7
- from team_agent.approvals.constants import (
8
- INTERNAL_MCP_AUTO_APPROVE_TOOLS,
9
- STARTUP_PROMPT_RUNTIME_CHECK_LIMIT,
10
- )
11
- from team_agent.approvals.parsing import (
12
- approval_choice_keys,
13
- approval_prompt_fingerprint,
14
- choose_internal_mcp_approval_choice,
15
- extract_approval_prompt,
16
- )
17
- from team_agent.events import EventLog
18
- from team_agent.status import APPROVAL_SCAN_LINES
19
-
20
-
21
- def handle_provider_runtime_prompts(workspace: Path, state: dict[str, Any], event_log: EventLog) -> None:
22
- from team_agent.runtime import _tmux_session_exists, _tmux_window_exists, get_adapter
23
- _ = workspace
24
- session_name = state.get("session_name")
25
- if not session_name or not _tmux_session_exists(session_name):
26
- return
27
- for agent_id, agent_state in state.get("agents", {}).items():
28
- if agent_state.get("status") in {"paused", "stopped", "missing"}:
29
- continue
30
- window = agent_state.get("window", agent_id)
31
- if not _tmux_window_exists(session_name, window):
32
- continue
33
- internal_mcp = handle_internal_mcp_approval_prompt(agent_id, session_name, window, event_log)
34
- if internal_mcp is not None:
35
- continue
36
- adapter = get_adapter(agent_state["provider"])
37
- for prompt_event in adapter.handle_runtime_prompts(session_name, window):
38
- event_log.write(
39
- "runtime.prompt_handled",
40
- agent_id=agent_id,
41
- provider=agent_state["provider"],
42
- **prompt_event,
43
- )
44
-
45
-
46
- def handle_provider_startup_prompts(workspace: Path, state: dict[str, Any], event_log: EventLog) -> None:
47
- from team_agent.runtime import _tmux_session_exists, _tmux_window_exists, get_adapter
48
- _ = workspace
49
- session_name = state.get("session_name")
50
- if not session_name or not _tmux_session_exists(session_name):
51
- return
52
- for agent_id, agent_state in state.get("agents", {}).items():
53
- if agent_state.get("status") in {"paused", "stopped", "missing"}:
54
- continue
55
- window = agent_state.get("window", agent_id)
56
- if not _tmux_window_exists(session_name, window):
57
- continue
58
- spawned_at = str(agent_state.get("spawned_at") or "")
59
- if agent_state.get("startup_prompt_check_spawned_at") != spawned_at:
60
- agent_state["startup_prompt_check_spawned_at"] = spawned_at
61
- agent_state["startup_prompt_check_count"] = 0
62
- check_count = int(agent_state.get("startup_prompt_check_count") or 0)
63
- if check_count >= STARTUP_PROMPT_RUNTIME_CHECK_LIMIT:
64
- continue
65
- agent_state["startup_prompt_check_count"] = check_count + 1
66
- adapter = get_adapter(agent_state["provider"])
67
- for prompt_event in adapter.handle_startup_prompts(session_name, window, checks=20, sleep_s=0.5):
68
- event_log.write(
69
- "runtime.startup_prompt_handled",
70
- agent_id=agent_id,
71
- provider=agent_state["provider"],
72
- **prompt_event,
73
- )
74
-
75
-
76
- def handle_internal_mcp_approval_prompt(
77
- agent_id: str,
78
- session_name: str,
79
- window: str,
80
- event_log: EventLog,
81
- ) -> dict[str, Any] | None:
82
- from team_agent.runtime import run_cmd
83
- target = f"{session_name}:{window}"
84
- proc = run_cmd(["tmux", "capture-pane", "-p", "-S", f"-{APPROVAL_SCAN_LINES}", "-t", target], timeout=5)
85
- if proc.returncode != 0:
86
- return None
87
- prompt = extract_approval_prompt(agent_id, proc.stdout)
88
- if not prompt or prompt.get("kind") != "mcp_tool":
89
- return None
90
- tool = str(prompt.get("tool") or "")
91
- fingerprint = approval_prompt_fingerprint(prompt)
92
- if tool not in INTERNAL_MCP_AUTO_APPROVE_TOOLS:
93
- result = {
94
- "ok": False,
95
- "action": "skipped",
96
- "reason": "tool_not_allowlisted",
97
- "tool": tool,
98
- "fingerprint": fingerprint,
99
- }
100
- event_log.write("runtime.internal_mcp_approval.skipped", agent_id=agent_id, **result)
101
- return result
102
- result = submit_internal_mcp_approval(agent_id, target, tool, prompt, proc.stdout)
103
- event_log.write("runtime.internal_mcp_approval.auto", agent_id=agent_id, **result)
104
- return result
105
-
106
-
107
- def submit_internal_mcp_approval(
108
- agent_id: str,
109
- target: str,
110
- tool: str,
111
- prompt: dict[str, Any],
112
- capture_text: str,
113
- attempts: int = 3,
114
- ) -> dict[str, Any]:
115
- from team_agent.runtime import run_cmd
116
- choice = choose_internal_mcp_approval_choice(prompt)
117
- fingerprint = approval_prompt_fingerprint(prompt)
118
- attempt_log: list[dict[str, Any]] = []
119
- current_prompt = prompt
120
- current_capture = capture_text
121
- for attempt in range(1, attempts + 1):
122
- keys = approval_choice_keys(current_prompt, current_capture, choice)
123
- proc = run_cmd(["tmux", "send-keys", "-t", target, *keys], timeout=10)
124
- if proc.returncode != 0:
125
- return {
126
- "ok": False,
127
- "action": "auto_approve",
128
- "tool": tool,
129
- "choice": choice,
130
- "fingerprint": fingerprint,
131
- "attempts": attempt_log + [{"attempt": attempt, "submitted": False, "error": proc.stderr.strip()}],
132
- "verification": "send_keys_failed",
133
- }
134
- time.sleep(0.35)
135
- verify = run_cmd(["tmux", "capture-pane", "-p", "-S", f"-{APPROVAL_SCAN_LINES}", "-t", target], timeout=5)
136
- if verify.returncode != 0:
137
- attempt_log.append({"attempt": attempt, "submitted": True, "keys": keys, "verification": "capture_failed"})
138
- continue
139
- after_prompt = extract_approval_prompt(agent_id, verify.stdout)
140
- if not after_prompt:
141
- return {
142
- "ok": True,
143
- "action": "auto_approved",
144
- "tool": tool,
145
- "choice": choice,
146
- "fingerprint": fingerprint,
147
- "attempts": attempt_log + [{"attempt": attempt, "submitted": True, "keys": keys, "verification": "prompt_absent"}],
148
- "verification": "prompt_absent_after_submit",
149
- }
150
- if after_prompt.get("kind") != "mcp_tool" or after_prompt.get("tool") != tool:
151
- return {
152
- "ok": True,
153
- "action": "auto_approved",
154
- "tool": tool,
155
- "choice": choice,
156
- "fingerprint": fingerprint,
157
- "attempts": attempt_log + [{"attempt": attempt, "submitted": True, "keys": keys, "verification": "different_prompt_present"}],
158
- "verification": "original_prompt_replaced",
159
- }
160
- attempt_log.append({"attempt": attempt, "submitted": True, "keys": keys, "verification": "prompt_still_present"})
161
- current_prompt = after_prompt
162
- current_capture = verify.stdout
163
- return {
164
- "ok": False,
165
- "action": "auto_approve",
166
- "tool": tool,
167
- "choice": choice,
168
- "fingerprint": fingerprint,
169
- "attempts": attempt_log,
170
- "verification": "prompt_still_present_after_retries",
171
- }
@@ -1,176 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import hashlib
4
- import re
5
- from datetime import datetime, timezone
6
- from pathlib import Path
7
- from typing import Any
8
-
9
- from team_agent.approvals.parsing import capture_has_approval_prompt
10
- from team_agent.events import EventLog
11
- from team_agent.message_store import MessageStore
12
- from team_agent.state import team_state_key
13
-
14
-
15
- def refresh_agent_runtime_statuses(workspace: Path, state: dict[str, Any], event_log: EventLog) -> None:
16
- from team_agent.runtime import _tmux_session_exists, _tmux_window_exists
17
- _ = workspace
18
- session_name = state.get("session_name")
19
- tmux_exists = _tmux_session_exists(session_name) if session_name else False
20
- for agent_id, agent_state in state.get("agents", {}).items():
21
- if agent_state.get("status") in {"paused", "stopped"}:
22
- continue
23
- old_status = agent_state.get("status")
24
- window = agent_state.get("window", agent_id)
25
- window_present = _tmux_window_exists(session_name, window) if tmux_exists else False
26
- agent_state["tmux_window_present"] = window_present
27
- if not window_present:
28
- if session_name:
29
- agent_state["status"] = "missing"
30
- else:
31
- status_capture = detect_provider_status(agent_state["provider"], session_name, window, include_capture=True)
32
- detected, capture_tail = status_capture if isinstance(status_capture, tuple) else (status_capture, "")
33
- if detected:
34
- agent_state["status"] = detected
35
- if detected == "awaiting_trust_prompt":
36
- agent_state["pane_capture_tail"] = capture_tail
37
- else:
38
- agent_state.setdefault("status", "running")
39
- if old_status != agent_state.get("status"):
40
- event_log.write(
41
- "runtime.status_detected",
42
- agent_id=agent_id,
43
- provider=agent_state.get("provider"),
44
- old_status=old_status,
45
- status=agent_state.get("status"),
46
- )
47
-
48
-
49
- def sync_agent_health(workspace: Path, state: dict[str, Any], store: MessageStore | None = None) -> dict[str, dict[str, Any]]:
50
- from team_agent.runtime import _tmux_window_exists, _tmux_pane_info, run_cmd
51
- from team_agent.messaging.activity_detector import classify_agent_activity
52
- store = store or MessageStore(workspace)
53
- session_name = state.get("session_name")
54
- owner_team_id = team_state_key(state)
55
- captures: dict[str, dict[str, Any]] = {}
56
- for agent_id, agent_state in state.get("agents", {}).items():
57
- health_status = agent_health_status(agent_state)
58
- last_output_at = agent_state.get("last_output_at")
59
- window = agent_state.get("window", agent_id)
60
- current_task = current_task_for_agent(state.get("tasks", []), agent_id)
61
- pane_delta_recent = False
62
- scrollback = ""
63
- pane_info: dict[str, Any] | None = None
64
- if session_name and _tmux_window_exists(session_name, window):
65
- proc = run_cmd(["tmux", "capture-pane", "-p", "-S", "-40", "-t", f"{session_name}:{window}"], timeout=5)
66
- if proc.returncode == 0:
67
- scrollback = proc.stdout
68
- digest = hashlib.sha256(proc.stdout.encode("utf-8", errors="ignore")).hexdigest()
69
- if digest != agent_state.get("last_output_hash"):
70
- pane_delta_recent = True
71
- last_output_at = datetime.now(timezone.utc).isoformat()
72
- agent_state["last_output_hash"] = digest
73
- agent_state["last_output_at"] = last_output_at
74
- if capture_has_approval_prompt(proc.stdout):
75
- health_status = "AWAITING_APPROVAL"
76
- try:
77
- pane_info = _tmux_pane_info(f"{session_name}:{window}")
78
- except Exception:
79
- pane_info = None
80
- if scrollback and health_status != "AWAITING_APPROVAL":
81
- activity = classify_agent_activity(
82
- agent_id,
83
- agent_state.get("provider") or "",
84
- last_output_at,
85
- pane_info,
86
- scrollback,
87
- active_task=current_task is not None,
88
- pane_delta_recent=pane_delta_recent,
89
- )
90
- agent_state["activity"] = {
91
- "status": activity.get("status"),
92
- "confidence": activity.get("confidence"),
93
- "rationale": activity.get("rationale"),
94
- "classified_at": datetime.now(timezone.utc).isoformat(),
95
- }
96
- if activity.get("confidence", 0) >= 0.85:
97
- raw = str(activity.get("status") or "")
98
- mapping = {"idle": "IDLE", "working": "WORKING", "stuck": "STUCK", "uncertain": "UNCERTAIN"}
99
- mapped = mapping.get(raw)
100
- if mapped:
101
- health_status = mapped
102
- store.upsert_agent_health(
103
- agent_id,
104
- health_status,
105
- last_output_at=last_output_at,
106
- context_usage_pct=agent_state.get("context_usage_pct"),
107
- current_task_id=current_task,
108
- owner_team_id=owner_team_id,
109
- )
110
- captures[agent_id] = {"scrollback": scrollback, "pane_info": pane_info, "health_status": health_status}
111
- return captures
112
-
113
-
114
- def agent_health_status(agent_state: dict[str, Any]) -> str:
115
- raw = str(agent_state.get("status") or "").lower()
116
- if raw in {"busy", "running"}:
117
- return "RUNNING" if raw == "busy" else "IDLE"
118
- if raw in {"paused", "blocked"}:
119
- return "BLOCKED"
120
- if raw in {"error", "missing", "interrupted"}:
121
- return "ERROR"
122
- if raw in {"stopped", "done"}:
123
- return "DONE"
124
- return "IDLE"
125
-
126
-
127
- def current_task_for_agent(tasks: list[dict[str, Any]], agent_id: str) -> str | None:
128
- active = {"pending", "ready", "running", "blocked", "needs_retry"}
129
- for task in reversed(tasks):
130
- if task.get("assignee") == agent_id and task.get("status", "pending") in active:
131
- return task.get("id")
132
- return None
133
-
134
-
135
- def age_text(iso_text: str | None) -> str:
136
- if not iso_text:
137
- return "-"
138
- try:
139
- dt = datetime.fromisoformat(iso_text)
140
- if dt.tzinfo is None:
141
- dt = dt.replace(tzinfo=timezone.utc)
142
- seconds = max(0, int((datetime.now(timezone.utc) - dt).total_seconds()))
143
- except ValueError:
144
- return "-"
145
- if seconds < 60:
146
- return f"{seconds}s ago"
147
- minutes = seconds // 60
148
- if minutes < 60:
149
- return f"{minutes}m ago"
150
- return f"{minutes // 60}h ago"
151
-
152
-
153
- def detect_provider_status(provider: str, session_name: str, window: str, *, include_capture: bool = False) -> str | tuple[str | None, str] | None:
154
- from team_agent.runtime import get_adapter, run_cmd
155
- from team_agent.messaging.tmux_prompt import detect_non_input_scrollback
156
- proc = run_cmd(["tmux", "capture-pane", "-p", "-t", f"{session_name}:{window}"], timeout=5)
157
- if proc.returncode != 0:
158
- return (None, "") if include_capture else None
159
- if detect_non_input_scrollback(proc.stdout) == "codex_trust_prompt":
160
- return ("awaiting_trust_prompt", proc.stdout) if include_capture else "awaiting_trust_prompt"
161
- patterns = get_adapter(provider).status_patterns()
162
- positions: dict[str, int] = {}
163
- for status_name, pattern in patterns.items():
164
- if not pattern:
165
- continue
166
- try:
167
- matches = list(re.finditer(pattern, proc.stdout, re.MULTILINE))
168
- except re.error:
169
- continue
170
- if matches:
171
- positions[status_name] = matches[-1].start()
172
- if not positions:
173
- return (None, proc.stdout) if include_capture else None
174
- latest = max(positions, key=positions.get)
175
- detected = {"idle": "running", "processing": "busy", "error": "error"}.get(latest)
176
- return (detected, proc.stdout) if include_capture else detected
@@ -1,137 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from team_agent.cli.parser import (
4
- SEND_ORDER_HINT,
5
- TeamAgentArgumentParser,
6
- _run_leader_passthrough,
7
- add_json,
8
- main,
9
- )
10
- from team_agent.cli.helpers import (
11
- _cli_error_payload,
12
- _emit_cli_error,
13
- _leader_launcher_args,
14
- _provider_args,
15
- _tmux_session_conflict_action,
16
- _tmux_session_conflict_name,
17
- _tmux_session_conflict_next_action,
18
- _workspace_from_args,
19
- emit,
20
- )
21
- from team_agent.cli.commands import (
22
- cmd_quick_start,
23
- cmd_codex,
24
- cmd_claude,
25
- cmd_init,
26
- cmd_validate,
27
- cmd_compile,
28
- _profile_scope,
29
- cmd_profile_init,
30
- cmd_profile_doctor,
31
- cmd_profile_show,
32
- cmd_launch,
33
- cmd_preflight,
34
- cmd_start,
35
- cmd_wait_ready,
36
- cmd_settle,
37
- cmd_status,
38
- cmd_approvals,
39
- cmd_peek,
40
- cmd_inbox,
41
- cmd_sessions,
42
- cmd_attach_leader,
43
- cmd_send,
44
- cmd_collect,
45
- cmd_diagnose,
46
- cmd_repair_state,
47
- cmd_validate_result,
48
- cmd_doctor,
49
- cmd_shutdown,
50
- cmd_restart,
51
- cmd_start_agent,
52
- cmd_stop_agent,
53
- cmd_reset_agent,
54
- cmd_add_agent,
55
- cmd_fork_agent,
56
- cmd_remove_agent,
57
- cmd_stuck_list,
58
- cmd_stuck_cancel,
59
- cmd_acknowledge_idle,
60
- cmd_allow_peer_talk,
61
- cmd_advanced,
62
- cmd_install_skill,
63
- _skill_dest_dir,
64
- _install_skill_to,
65
-
66
- )
67
- from team_agent.cli.e2e import (
68
- _fake_spec,
69
- _run_fake_e2e,
70
- _run_real_launch_smoke,
71
- cmd_e2e,
72
- )
73
-
74
- __all__ = [
75
- 'SEND_ORDER_HINT',
76
- 'TeamAgentArgumentParser',
77
- 'main',
78
- 'add_json',
79
- '_run_leader_passthrough',
80
- 'emit',
81
- '_workspace_from_args',
82
- '_emit_cli_error',
83
- '_cli_error_payload',
84
- '_tmux_session_conflict_name',
85
- '_tmux_session_conflict_next_action',
86
- '_tmux_session_conflict_action',
87
- '_provider_args',
88
- '_leader_launcher_args',
89
- 'cmd_quick_start',
90
- 'cmd_codex',
91
- 'cmd_claude',
92
- 'cmd_init',
93
- 'cmd_validate',
94
- 'cmd_compile',
95
- '_profile_scope',
96
- 'cmd_profile_init',
97
- 'cmd_profile_doctor',
98
- 'cmd_profile_show',
99
- 'cmd_launch',
100
- 'cmd_preflight',
101
- 'cmd_start',
102
- 'cmd_wait_ready',
103
- 'cmd_settle',
104
- 'cmd_status',
105
- 'cmd_approvals',
106
- 'cmd_peek',
107
- 'cmd_inbox',
108
- 'cmd_sessions',
109
- 'cmd_attach_leader',
110
- 'cmd_send',
111
- 'cmd_collect',
112
- 'cmd_diagnose',
113
- 'cmd_repair_state',
114
- 'cmd_validate_result',
115
- 'cmd_doctor',
116
- 'cmd_shutdown',
117
- 'cmd_restart',
118
- 'cmd_start_agent',
119
- 'cmd_stop_agent',
120
- 'cmd_reset_agent',
121
- 'cmd_add_agent',
122
- 'cmd_fork_agent',
123
- 'cmd_remove_agent',
124
- 'cmd_stuck_list',
125
- 'cmd_stuck_cancel',
126
- 'cmd_acknowledge_idle',
127
- 'cmd_allow_peer_talk',
128
- 'cmd_advanced',
129
- 'cmd_install_skill',
130
- '_skill_dest_dir',
131
- '_install_skill_to',
132
- 'cmd_e2e',
133
- '_run_fake_e2e',
134
- '_run_real_launch_smoke',
135
- '_fake_spec',
136
-
137
- ]