@team-agent/installer 0.2.10 → 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 -83
  203. package/src/team_agent/coordinator/lifecycle.py +0 -363
  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 -200
  226. package/src/team_agent/idle_takeover.py +0 -59
  227. package/src/team_agent/idle_takeover_wiring.py +0 -111
  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 -254
  255. package/src/team_agent/messaging/delivery.py +0 -473
  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 -457
  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 -86
  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 -1239
  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 -143
  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 -602
  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,301 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from datetime import datetime, timezone
4
- from pathlib import Path
5
- from typing import Any
6
-
7
- from team_agent.events import EventLog
8
- from team_agent.display.backend import DISPLAY_BACKENDS_WITH_WORKER_VIEWS, resolve_display_backend
9
- from team_agent.launch.bootstrap import (
10
- attach_team_profile_dirs,
11
- spec_team_dir,
12
- tmux_session_conflict_error,
13
- )
14
- from team_agent.launch.config import effective_runtime_config, requires_direct_leader_receiver
15
- from team_agent.launch.requirements import ensure_agent_start_requirements
16
- from team_agent.message_store import MessageStore
17
- from team_agent.permissions import resolve_permissions
18
- from team_agent.routing import route_task
19
- from team_agent.spec import load_spec, workspace_from_spec
20
- from team_agent.state import (
21
- load_runtime_state,
22
- merge_workspace_team_state,
23
- populate_team_owner_from_env,
24
- save_runtime_state,
25
- write_team_state,
26
- )
27
-
28
-
29
- def launch(
30
- spec_path: Path,
31
- dry_run: bool = False,
32
- auto_approve: bool = False,
33
- skip_profile_smoke: bool = False,
34
- ) -> dict[str, Any]:
35
- from team_agent.runtime import (
36
- RuntimeError,
37
- _attach_leader_to_state,
38
- _capture_agent_session,
39
- _enable_codex_fast_mode,
40
- _open_worker_displays,
41
- _save_team_runtime_snapshot,
42
- _tmux_session_exists,
43
- ensure_workspace_dirs,
44
- get_adapter,
45
- get_adapter_or_raise,
46
- run_cmd,
47
- shell_command_for_agent,
48
- )
49
-
50
- spec = load_spec(spec_path)
51
- workspace = workspace_from_spec(spec, spec_path)
52
- team_dir = spec_team_dir(spec_path, workspace)
53
- attach_team_profile_dirs(spec, spec_path, workspace, team_dir)
54
- ensure_workspace_dirs(workspace)
55
- event_log = EventLog(workspace)
56
- session_name = spec.get("runtime", {}).get("session_name") or f"team-{spec['team']['name']}"
57
- display_backend = resolve_display_backend(
58
- spec.get("runtime", {}).get("display_backend"),
59
- event_log=event_log,
60
- source="launch",
61
- )
62
- state = {
63
- "spec_path": str(spec_path.resolve()),
64
- "workspace": str(workspace),
65
- "team_dir": str(team_dir),
66
- "session_name": session_name,
67
- "leader": spec.get("leader"),
68
- "agents": {},
69
- "tasks": [dict(task) for task in spec.get("tasks", [])],
70
- "display_backend": display_backend,
71
- }
72
- runtime_cfg = effective_runtime_config(spec.get("runtime", {}))
73
- dangerous_auto_approve = bool(runtime_cfg.get("dangerous_auto_approve"))
74
- dangerous_inherited = bool(runtime_cfg.get("dangerous_auto_approve_inherited"))
75
-
76
- routing_decisions: list[dict[str, Any]] = []
77
- for task in state["tasks"]:
78
- route = route_task(spec, task)
79
- task["assignee"] = route["agent_id"]
80
- decision = {
81
- "source": "launch",
82
- "task_id": task.get("id"),
83
- "selected_agent": route["agent_id"],
84
- "reason": route["reason"],
85
- "manual_override": False,
86
- }
87
- routing_decisions.append(decision)
88
- event_log.write("routing.decision", **decision)
89
-
90
- permission_summary = [resolve_permissions(agent) for agent in spec.get("agents", [])]
91
- event_log.write(
92
- "launch.permissions_resolved",
93
- permissions=permission_summary,
94
- dangerous_auto_approve=dangerous_auto_approve,
95
- dangerous_auto_approve_source=runtime_cfg.get("dangerous_auto_approve_source"),
96
- )
97
- if dry_run:
98
- return {
99
- "ok": True,
100
- "dry_run": True,
101
- "session_name": session_name,
102
- "permissions": permission_summary,
103
- "routes": routing_decisions,
104
- "safety": {
105
- "dangerous_auto_approve": dangerous_auto_approve,
106
- "dangerous_auto_approve_source": runtime_cfg.get("dangerous_auto_approve_source"),
107
- "dangerous_auto_approve_inherited": dangerous_inherited,
108
- "requires_explicit_yes": dangerous_auto_approve and not dangerous_inherited,
109
- },
110
- }
111
- if dangerous_auto_approve:
112
- event_log.write(
113
- "launch.dangerous_auto_approve_requested",
114
- reason="provider may bypass approvals or sandbox",
115
- source=runtime_cfg.get("dangerous_auto_approve_source"),
116
- inherited=dangerous_inherited,
117
- inherited_provider=runtime_cfg.get("dangerous_auto_approve_provider"),
118
- inherited_flag=runtime_cfg.get("dangerous_auto_approve_flag"),
119
- )
120
- if dangerous_auto_approve and not dangerous_inherited and not auto_approve:
121
- raise RuntimeError("dangerous_auto_approve requires explicit --yes after reviewing launch risk")
122
- if runtime_cfg.get("require_user_approval_before_launch", True) and not auto_approve:
123
- raise RuntimeError("launch requires approval; rerun with --yes after reviewing resolved permissions")
124
-
125
- tmux = get_adapter_or_raise("tmux")
126
- _ = tmux
127
- if _tmux_session_exists(session_name):
128
- event_log.write(
129
- "launch.session_conflict",
130
- session=session_name,
131
- action="use a different team name or runtime.session_name; do not terminate existing tmux sessions from startup",
132
- )
133
- raise RuntimeError(tmux_session_conflict_error(session_name))
134
- ensure_agent_start_requirements(
135
- workspace,
136
- spec.get("agents", []),
137
- event_log,
138
- "launch",
139
- skip_profile_smoke=skip_profile_smoke,
140
- )
141
-
142
- leader_receiver = None
143
- leader_provider = state.get("leader", {}).get("provider")
144
- require_leader_receiver = requires_direct_leader_receiver(spec, runtime_cfg)
145
- if runtime_cfg.get("auto_attach_leader", True) and leader_provider != "fake":
146
- try:
147
- leader_receiver, _ = _attach_leader_to_state(
148
- workspace,
149
- state,
150
- pane=None,
151
- provider=leader_provider,
152
- event_log=event_log,
153
- source="launch",
154
- require_current=require_leader_receiver,
155
- )
156
- except RuntimeError as exc:
157
- event_log.write(
158
- "leader_receiver.auto_attach_skipped",
159
- provider=leader_provider,
160
- reason=str(exc),
161
- required=require_leader_receiver,
162
- suggestion="Start the leader with `team-agent codex` or run quick-start from an existing tmux pane.",
163
- )
164
- if require_leader_receiver:
165
- raise
166
-
167
- first = True
168
- started: list[dict[str, Any]] = []
169
- display_jobs: list[tuple[str, dict[str, Any]]] = []
170
- for agent in spec.get("agents", []):
171
- if agent.get("paused"):
172
- state["agents"][agent["id"]] = {"status": "paused", "provider": agent["provider"]}
173
- continue
174
- adapter = get_adapter(agent["provider"])
175
- if not adapter.is_installed():
176
- event_log.write(
177
- "launch.provider_missing",
178
- agent_id=agent["id"],
179
- provider=agent["provider"],
180
- command=adapter.command_name,
181
- )
182
- raise RuntimeError(
183
- f"Provider {agent['provider']} command {adapter.command_name!r} not found for agent {agent['id']}"
184
- )
185
- mcp_config = adapter.mcp_config(workspace, agent["id"])
186
- mcp_path = adapter.install_mcp(workspace, agent["id"], mcp_config)
187
- command_agent = dict(agent)
188
- command_agent["_runtime"] = runtime_cfg
189
- command = shell_command_for_agent(command_agent, workspace, mcp_config)
190
- spawn_time = datetime.now(timezone.utc)
191
- event_log.write(
192
- "launch.agent_start",
193
- agent_id=agent["id"],
194
- provider=agent["provider"],
195
- session=session_name,
196
- window=agent["id"],
197
- command=command,
198
- mcp_config=str(mcp_path),
199
- )
200
- if first:
201
- proc = run_cmd(["tmux", "new-session", "-d", "-s", session_name, "-n", agent["id"], "sh", "-lc", command])
202
- first = False
203
- else:
204
- proc = run_cmd(["tmux", "new-window", "-t", session_name, "-n", agent["id"], "sh", "-lc", command])
205
- if proc.returncode != 0:
206
- try:
207
- adapter.cleanup_mcp(workspace, agent["id"], mcp_path)
208
- except Exception as exc:
209
- event_log.write(
210
- "launch.mcp_cleanup_failed",
211
- agent_id=agent["id"],
212
- provider=agent["provider"],
213
- mcp_config=str(mcp_path),
214
- error=str(exc),
215
- )
216
- event_log.write(
217
- "launch.agent_failed",
218
- agent_id=agent["id"],
219
- stderr=proc.stderr,
220
- stdout=proc.stdout,
221
- )
222
- raise RuntimeError(f"Failed to start agent {agent['id']}: {proc.stderr.strip()}")
223
- handled_prompts = (
224
- adapter.handle_startup_prompts(session_name, agent["id"], checks=20, sleep_s=0.5)
225
- if hasattr(adapter, "handle_startup_prompts")
226
- else []
227
- )
228
- for prompt_event in handled_prompts:
229
- event_log.write(
230
- "launch.startup_prompt_handled",
231
- agent_id=agent["id"],
232
- provider=agent["provider"],
233
- **prompt_event,
234
- )
235
- if runtime_cfg.get("fast") and agent.get("provider") == "codex":
236
- fast_result = _enable_codex_fast_mode(session_name, agent["id"])
237
- event_log.write("launch.codex_fast_mode", agent_id=agent["id"], **fast_result)
238
- state["agents"][agent["id"]] = {
239
- "status": "running",
240
- "provider": agent["provider"],
241
- "agent_id": agent["id"],
242
- "model": agent.get("model"),
243
- "auth_mode": agent.get("auth_mode"),
244
- "profile": agent.get("profile"),
245
- "window": agent["id"],
246
- "mcp_config": str(mcp_path),
247
- "permissions": resolve_permissions(agent),
248
- "session_id": None,
249
- "rollout_path": None,
250
- "captured_at": None,
251
- "captured_via": None,
252
- "attribution_confidence": None,
253
- "spawn_cwd": str(workspace),
254
- "spawned_at": spawn_time.isoformat(),
255
- }
256
- profile_launch = command_agent.get("_provider_profile") or {}
257
- if profile_launch.get("claude_projects_root"):
258
- state["agents"][agent["id"]]["claude_projects_root"] = profile_launch["claude_projects_root"]
259
- if command_agent.get("_session_id"):
260
- state["agents"][agent["id"]]["_pending_session_id"] = command_agent["_session_id"]
261
- known_session_ids = {
262
- str(item.get("session_id"))
263
- for aid, item in state.get("agents", {}).items()
264
- if aid != agent["id"] and item.get("session_id")
265
- }
266
- _capture_agent_session(
267
- workspace,
268
- agent["id"],
269
- state["agents"][agent["id"]],
270
- event_log,
271
- timeout_s=1.5,
272
- exclude_session_ids=known_session_ids,
273
- raise_on_missed=False,
274
- )
275
- if state.get("display_backend") in DISPLAY_BACKENDS_WITH_WORKER_VIEWS:
276
- display_jobs.append((agent["id"], agent))
277
- started.append({"agent_id": agent["id"], "provider": agent["provider"], "window": agent["id"]})
278
- for agent_id, display in _open_worker_displays(
279
- workspace,
280
- session_name,
281
- display_jobs,
282
- event_log,
283
- state.get("display_backend", "none"),
284
- ).items():
285
- if agent_id in state["agents"]:
286
- state["agents"][agent_id]["display"] = display
287
- populate_team_owner_from_env(state, source="launch")
288
- workspace_state = merge_workspace_team_state(load_runtime_state(workspace), state)
289
- save_runtime_state(workspace, workspace_state)
290
- _save_team_runtime_snapshot(workspace, state)
291
- MessageStore(workspace)
292
- write_team_state(workspace, spec, state)
293
- event_log.write("launch.complete", session=session_name, started=started)
294
- return {
295
- "ok": True,
296
- "session_name": session_name,
297
- "agents": started,
298
- "permissions": permission_summary,
299
- "routes": routing_decisions,
300
- "leader_receiver": leader_receiver,
301
- }
@@ -1,57 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Any
5
-
6
- from team_agent.diagnose import (
7
- compact_model_checks,
8
- format_model_check_failures,
9
- format_profile_check_failures,
10
- format_profile_smoke_failures,
11
- model_checks_for_agents,
12
- profile_checks_for_agents,
13
- profile_smoke_checks_for_agents,
14
- )
15
- from team_agent.events import EventLog
16
- from team_agent.profiles import compact_profile_check
17
-
18
-
19
- def ensure_agent_start_requirements(
20
- workspace: Path,
21
- agents: list[dict[str, Any]],
22
- event_log: EventLog,
23
- event_prefix: str,
24
- skip_profile_smoke: bool = False,
25
- ) -> None:
26
- from team_agent.runtime import RuntimeError, get_adapter
27
- active_agents = [agent for agent in agents if not agent.get("paused")]
28
- for agent in active_agents:
29
- adapter = get_adapter(agent["provider"])
30
- if not adapter.is_installed():
31
- event_log.write(
32
- f"{event_prefix}.provider_missing",
33
- agent_id=agent["id"],
34
- provider=agent["provider"],
35
- command=adapter.command_name,
36
- )
37
- raise RuntimeError(
38
- f"Provider {agent['provider']} command {adapter.command_name!r} not found for agent {agent['id']}"
39
- )
40
- profile_checks = profile_checks_for_agents(workspace, active_agents)
41
- profile_failures = [item for item in profile_checks if item.get("ok") is False]
42
- event_log.write(f"{event_prefix}.profile_check", ok=not profile_failures, checks=[compact_profile_check(item) for item in profile_checks])
43
- if profile_failures:
44
- raise RuntimeError(format_profile_check_failures(profile_failures))
45
- if skip_profile_smoke:
46
- event_log.write(f"{event_prefix}.profile_smoke_check", ok=True, skipped=True, reason="already_checked")
47
- else:
48
- smoke_checks = profile_smoke_checks_for_agents(workspace, active_agents)
49
- smoke_failures = [item for item in smoke_checks if item.get("ok") is False]
50
- event_log.write(f"{event_prefix}.profile_smoke_check", ok=not smoke_failures, checks=[compact_profile_check(item) for item in smoke_checks])
51
- if smoke_failures:
52
- raise RuntimeError(format_profile_smoke_failures(smoke_failures))
53
- checks = model_checks_for_agents(active_agents, workspace)
54
- failures = [item for item in checks if item.get("ok") is False]
55
- event_log.write(f"{event_prefix}.model_check", ok=not failures, checks=compact_model_checks(checks))
56
- if failures:
57
- raise RuntimeError(format_model_check_failures(failures))