@team-agent/installer 0.2.11 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +1204 -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 +1207 -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 +557 -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 +1084 -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 +526 -0
  59. package/crates/team-agent/src/leader/rediscover.rs +1101 -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 +237 -0
  64. package/crates/team-agent/src/leader/tests/identity.rs +206 -0
  65. package/crates/team-agent/src/leader/tests/idle.rs +272 -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 +410 -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 +489 -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 +2109 -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 +985 -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 +710 -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 +187 -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 +468 -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 +743 -0
  110. package/crates/team-agent/src/messaging/helpers.rs +209 -0
  111. package/crates/team-agent/src/messaging/leader_receiver.rs +329 -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 +553 -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 +578 -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 +659 -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 +765 -0
  172. package/crates/team-agent/src/tmux_backend.rs +810 -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 +118 -112
  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,363 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import copy
4
- from datetime import datetime, timezone
5
- from pathlib import Path
6
- from typing import Any
7
-
8
- from team_agent import runtime as _runtime
9
- from team_agent.errors import RuntimeError
10
- from team_agent.events import EventLog
11
- from team_agent.message_store import MessageStore
12
- from team_agent.providers import ResumeUnavailable
13
- from team_agent.spec import load_spec
14
- from team_agent.state import (
15
- check_team_owner,
16
- load_runtime_state,
17
- resolve_team_scoped_state,
18
- save_runtime_state,
19
- save_team_scoped_state,
20
- write_team_state,
21
- )
22
-
23
-
24
- _RUNTIME_SYMBOLS = (
25
- "_attach_profile_resume_root",
26
- "_attach_team_profile_dirs",
27
- "_capture_agent_session",
28
- "_clear_session_capture_fields",
29
- "_deliver_pending_message",
30
- "_effective_runtime_config",
31
- "_enable_codex_fast_mode",
32
- "_ensure_agent_start_requirements",
33
- "_find_agent",
34
- "_handle_startup_prompts_and_verify_window",
35
- "_open_ghostty_worker_window",
36
- "_open_ghostty_workspace_agent_display",
37
- "_prepare_resume_state",
38
- "_running_agent_state",
39
- "_runtime_lock",
40
- "_spec_team_dir",
41
- "_tmux_start_command_for_agent_window",
42
- "_tmux_window_exists",
43
- "ensure_workspace_dirs",
44
- "get_adapter",
45
- "run_cmd",
46
- "shell_command_for_agent",
47
- "shell_resume_command_for_agent",
48
- "start_coordinator",
49
- )
50
- for _name in _RUNTIME_SYMBOLS:
51
- if not hasattr(_runtime, _name):
52
- raise ImportError(f"team_agent.runtime missing lifecycle start dependency: {_name}")
53
-
54
-
55
- def _runtime_proxy(name: str):
56
- def proxy(*args: Any, **kwargs: Any) -> Any:
57
- return getattr(_runtime, name)(*args, **kwargs)
58
-
59
- return proxy
60
-
61
-
62
- globals().update({_name: _runtime_proxy(_name) for _name in _RUNTIME_SYMBOLS})
63
-
64
-
65
- def _resume_rollout_missing(agent: dict[str, Any], previous: dict[str, Any]) -> bool:
66
- if agent.get("provider") != "codex" or not previous.get("session_id"):
67
- return False
68
- rollout_path = previous.get("rollout_path")
69
- return not rollout_path or not Path(str(rollout_path)).exists()
70
-
71
-
72
- def start_agent(
73
- workspace: Path,
74
- agent_id: str,
75
- force: bool = False,
76
- open_display: bool = True,
77
- allow_fresh: bool = False,
78
- team: str | None = None,
79
- ) -> dict[str, Any]:
80
- with _runtime_lock(workspace, "start-agent"):
81
- return _start_agent_unlocked(workspace, agent_id, force=force, open_display=open_display, allow_fresh=allow_fresh, team=team)
82
-
83
-
84
- def _start_agent_unlocked(workspace: Path, agent_id: str, force: bool, open_display: bool, allow_fresh: bool, team: str | None = None) -> dict[str, Any]:
85
- state, refusal = resolve_team_scoped_state(workspace, team)
86
- if refusal:
87
- return refusal
88
- gate = check_team_owner(state)
89
- if gate:
90
- return gate
91
- spec_path = Path(state.get("spec_path", workspace / "team.spec.yaml"))
92
- if not spec_path.exists():
93
- raise RuntimeError(f"missing spec for start-agent: {spec_path}")
94
- spec = load_spec(spec_path)
95
- team_dir = Path(str(state.get("team_dir"))) if state.get("team_dir") else _spec_team_dir(spec_path, workspace)
96
- _attach_team_profile_dirs(spec, spec_path, workspace, team_dir)
97
- agent = _find_agent(spec, agent_id)
98
- if not agent or spec.get("leader", {}).get("id") == agent_id:
99
- raise RuntimeError(f"unknown worker agent id: {agent_id}")
100
- if agent.get("paused"):
101
- return {"ok": False, "status": "paused", "agent_id": agent_id, "reason": "agent_paused"}
102
- ensure_workspace_dirs(workspace)
103
- event_log = EventLog(workspace)
104
- runtime_cfg = _effective_runtime_config(spec.get("runtime", {}))
105
- session_name = state.get("session_name") or spec.get("runtime", {}).get("session_name") or f"team-{spec['team']['name']}"
106
- state["session_name"] = session_name
107
- state.setdefault("workspace", str(workspace))
108
- state.setdefault("team_dir", str(team_dir))
109
- state.setdefault("spec_path", str(spec_path.resolve()))
110
- state.setdefault("leader", spec.get("leader"))
111
- state.setdefault("tasks", [dict(task) for task in spec.get("tasks", [])])
112
- state.setdefault("agents", {})
113
- state["display_backend"] = spec.get("runtime", {}).get("display_backend", state.get("display_backend") or "none")
114
-
115
- previous = state.get("agents", {}).get(agent_id, {})
116
- target = f"{session_name}:{agent_id}"
117
- window_present = _tmux_window_exists(session_name, agent_id)
118
- if window_present and not force:
119
- agent_state = _running_agent_state(workspace, agent, previous)
120
- agent_state["session_name"] = session_name
121
- if open_display and state.get("display_backend") in {"ghostty", "ghostty_window"}:
122
- display = agent_state.get("display") or {}
123
- if display.get("status") != "opened":
124
- agent_state["display"] = _open_ghostty_worker_window(workspace, session_name, agent_id, agent, event_log)
125
- elif open_display and state.get("display_backend") == "ghostty_workspace":
126
- display = agent_state.get("display") or {}
127
- if display.get("status") != "opened":
128
- agent_state["display"] = _open_ghostty_workspace_agent_display(session_name, agent_id, agent, display, event_log)
129
- state["agents"][agent_id] = agent_state
130
- save_team_scoped_state(workspace, state)
131
- write_team_state(workspace, spec, state)
132
- coordinator = start_coordinator(workspace)
133
- event_log.write("start_agent.noop", agent_id=agent_id, target=target, coordinator=coordinator)
134
- return {"ok": True, "agent_id": agent_id, "status": "running", "start_mode": "noop", "target": target, "coordinator": coordinator}
135
-
136
- if window_present and force:
137
- proc = run_cmd(["tmux", "kill-window", "-t", target], timeout=10)
138
- if proc.returncode != 0:
139
- raise RuntimeError(f"failed to replace existing agent window {target}: {proc.stderr.strip()}")
140
-
141
- _ensure_agent_start_requirements(workspace, [agent], event_log, "start_agent")
142
- adapter = get_adapter(agent["provider"])
143
- if not adapter.is_installed():
144
- event_log.write("start_agent.provider_missing", agent_id=agent_id, provider=agent["provider"], command=adapter.command_name)
145
- raise RuntimeError(f"Provider {agent['provider']} command {adapter.command_name!r} not found for agent {agent_id}")
146
- mcp_config = adapter.mcp_config(workspace, agent_id)
147
- mcp_path = adapter.install_mcp(workspace, agent_id, mcp_config)
148
- command_agent = copy.deepcopy(agent)
149
- command_agent["_runtime"] = runtime_cfg
150
- previous = _attach_profile_resume_root(workspace, command_agent, previous)
151
- known_session_ids = {
152
- str(item.get("session_id"))
153
- for aid, item in state.get("agents", {}).items()
154
- if aid != agent_id and item.get("session_id")
155
- }
156
- try:
157
- previous = _prepare_resume_state(
158
- workspace,
159
- agent_id,
160
- previous,
161
- adapter,
162
- event_log,
163
- known_session_ids,
164
- allow_fresh_on_resume_failure=allow_fresh,
165
- )
166
- except ResumeUnavailable as exc:
167
- try:
168
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
169
- except Exception as cleanup_exc:
170
- event_log.write(
171
- "start_agent.mcp_cleanup_failed",
172
- agent_id=agent_id,
173
- provider=agent["provider"],
174
- mcp_config=str(mcp_path),
175
- error=str(cleanup_exc),
176
- )
177
- raise RuntimeError(str(exc)) from exc
178
- missing_resume_rollout = _resume_rollout_missing(agent, previous)
179
- start_mode = "resumed" if previous.get("session_id") else "fresh"
180
- if missing_resume_rollout and allow_fresh:
181
- event_log.write(
182
- "start_agent.resume_window_missing_fallback_fresh",
183
- agent_id=agent_id,
184
- provider=agent["provider"],
185
- session_id=previous.get("session_id"),
186
- reason="rollout_missing",
187
- )
188
- start_mode = "fresh_after_missing_rollout"
189
- previous = dict(previous)
190
- previous["session_id"] = None
191
- if start_mode == "resumed":
192
- try:
193
- command = shell_resume_command_for_agent(command_agent, previous, workspace, mcp_config)
194
- except ResumeUnavailable as exc:
195
- event_log.write("start_agent.resume_unavailable", agent_id=agent_id, error=str(exc))
196
- if not allow_fresh:
197
- try:
198
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
199
- except Exception as cleanup_exc:
200
- event_log.write(
201
- "start_agent.mcp_cleanup_failed",
202
- agent_id=agent_id,
203
- provider=agent["provider"],
204
- mcp_config=str(mcp_path),
205
- error=str(cleanup_exc),
206
- )
207
- raise RuntimeError(
208
- f"Cannot resume agent {agent_id}: {exc}. "
209
- "Use team-agent start-agent --allow-fresh only if losing that worker context is acceptable."
210
- ) from exc
211
- command = shell_command_for_agent(command_agent, workspace, mcp_config)
212
- start_mode = "fresh"
213
- else:
214
- command = shell_command_for_agent(command_agent, workspace, mcp_config)
215
- event_log.write(
216
- "start_agent.fresh_spawn",
217
- agent_id=agent_id,
218
- provider=agent["provider"],
219
- reason="rollout_missing" if start_mode == "fresh_after_missing_rollout" else "session_id_missing",
220
- )
221
-
222
- from team_agent.lifecycle.paste_buffer_hygiene import cleanup_stale_team_agent_buffers
223
- cleanup_stale_team_agent_buffers(workspace, event_log, context=f"start_agent:{agent_id}")
224
- tmux_cmd, tmux_start_mode = _tmux_start_command_for_agent_window(session_name, agent_id, command)
225
- event_log.write(
226
- "start_agent.agent_start",
227
- agent_id=agent_id,
228
- provider=agent["provider"],
229
- start_mode=start_mode,
230
- session_id=previous.get("session_id"),
231
- session=session_name,
232
- window=agent_id,
233
- tmux_start_mode=tmux_start_mode,
234
- command=command,
235
- mcp_config=str(mcp_path),
236
- )
237
- proc = run_cmd(tmux_cmd)
238
- if proc.returncode != 0:
239
- try:
240
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
241
- except Exception as exc:
242
- event_log.write("start_agent.mcp_cleanup_failed", agent_id=agent_id, provider=agent["provider"], error=str(exc))
243
- event_log.write("start_agent.agent_failed", agent_id=agent_id, stderr=proc.stderr, stdout=proc.stdout)
244
- raise RuntimeError(f"Failed to start agent {agent_id}: {proc.stderr.strip()}")
245
-
246
- if not _handle_startup_prompts_and_verify_window(
247
- adapter, event_log, "start_agent", agent_id, agent["provider"], session_name, start_mode
248
- ):
249
- if start_mode != "resumed":
250
- try:
251
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
252
- except Exception as exc:
253
- event_log.write("start_agent.mcp_cleanup_failed", agent_id=agent_id, provider=agent["provider"], error=str(exc))
254
- raise RuntimeError(f"Failed to start agent {agent_id}: tmux window exited after start")
255
- if not allow_fresh:
256
- try:
257
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
258
- except Exception as cleanup_exc:
259
- event_log.write(
260
- "start_agent.mcp_cleanup_failed",
261
- agent_id=agent_id,
262
- provider=agent["provider"],
263
- mcp_config=str(mcp_path),
264
- error=str(cleanup_exc),
265
- )
266
- raise RuntimeError(
267
- f"Cannot resume agent {agent_id}: resume window exited or did not become visible. "
268
- "Use team-agent start-agent --allow-fresh only if losing that worker context is acceptable."
269
- )
270
- event_log.write(
271
- "start_agent.resume_window_missing_fallback_fresh",
272
- agent_id=agent_id,
273
- provider=agent["provider"],
274
- session_id=previous.get("session_id"),
275
- )
276
- command = shell_command_for_agent(command_agent, workspace, mcp_config)
277
- start_mode = "fresh_after_missing_rollout" if missing_resume_rollout else "fresh"
278
- cleanup_stale_team_agent_buffers(workspace, event_log, context=f"start_agent_fallback:{agent_id}")
279
- tmux_cmd, tmux_start_mode = _tmux_start_command_for_agent_window(session_name, agent_id, command)
280
- event_log.write(
281
- "start_agent.agent_start",
282
- agent_id=agent_id,
283
- provider=agent["provider"],
284
- start_mode=start_mode,
285
- session_id=None,
286
- session=session_name,
287
- window=agent_id,
288
- tmux_start_mode=tmux_start_mode,
289
- command=command,
290
- mcp_config=str(mcp_path),
291
- )
292
- proc = run_cmd(tmux_cmd)
293
- if proc.returncode != 0:
294
- try:
295
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
296
- except Exception as exc:
297
- event_log.write("start_agent.mcp_cleanup_failed", agent_id=agent_id, provider=agent["provider"], error=str(exc))
298
- event_log.write("start_agent.agent_failed", agent_id=agent_id, stderr=proc.stderr, stdout=proc.stdout)
299
- raise RuntimeError(f"Failed to start agent {agent_id} fresh after resume exit: {proc.stderr.strip()}")
300
- if not _handle_startup_prompts_and_verify_window(
301
- adapter, event_log, "start_agent", agent_id, agent["provider"], session_name, start_mode
302
- ):
303
- try:
304
- adapter.cleanup_mcp(workspace, agent_id, mcp_path)
305
- except Exception as exc:
306
- event_log.write("start_agent.mcp_cleanup_failed", agent_id=agent_id, provider=agent["provider"], error=str(exc))
307
- raise RuntimeError(f"Failed to start agent {agent_id} fresh: tmux window exited after start")
308
- if runtime_cfg.get("fast") and agent.get("provider") == "codex":
309
- fast_result = _enable_codex_fast_mode(session_name, agent_id)
310
- event_log.write("start_agent.codex_fast_mode", agent_id=agent_id, **fast_result)
311
-
312
- spawn_time = datetime.now(timezone.utc)
313
- agent_state = _running_agent_state(workspace, agent, previous)
314
- agent_state.update({"mcp_config": str(mcp_path), "session_name": session_name, "spawned_at": spawn_time.isoformat()})
315
- profile_launch = command_agent.get("_provider_profile") or {}
316
- if profile_launch.get("claude_projects_root"):
317
- agent_state["claude_projects_root"] = profile_launch["claude_projects_root"]
318
- if start_mode in {"fresh", "fresh_after_missing_rollout"}:
319
- _clear_session_capture_fields(agent_state)
320
- if command_agent.get("_session_id"):
321
- agent_state["_pending_session_id"] = command_agent["_session_id"]
322
- _capture_agent_session(workspace, agent_id, agent_state, event_log, timeout_s=1.5, exclude_session_ids=known_session_ids, raise_on_missed=False)
323
- if open_display and state.get("display_backend") in {"ghostty", "ghostty_window"}:
324
- agent_state["display"] = _open_ghostty_worker_window(workspace, session_name, agent_id, agent, event_log)
325
- elif open_display and state.get("display_backend") == "ghostty_workspace":
326
- agent_state["display"] = _open_ghostty_workspace_agent_display(
327
- session_name,
328
- agent_id,
329
- agent,
330
- previous.get("display") or {},
331
- event_log,
332
- )
333
- state["agents"][agent_id] = agent_state
334
- save_team_scoped_state(workspace, state)
335
- store = MessageStore(workspace)
336
- delivered_messages: list[str] = []
337
- for row in store.messages():
338
- if row["recipient"] == agent_id and row["status"] in {"pending", "accepted"}:
339
- delivered = _deliver_pending_message(workspace, state, row["message_id"], wait_visible=True, timeout=30.0)
340
- if delivered.get("ok"):
341
- delivered_messages.append(row["message_id"])
342
- event_log.write("send.pending_delivered", message_id=row["message_id"], agent_id=agent_id, source="start_agent")
343
- write_team_state(workspace, spec, state)
344
- coordinator = start_coordinator(workspace)
345
- event_log.write(
346
- "start_agent.complete",
347
- agent_id=agent_id,
348
- session=session_name,
349
- start_mode=start_mode,
350
- delivered_messages=delivered_messages,
351
- coordinator=coordinator,
352
- )
353
- return {
354
- "ok": True,
355
- "agent_id": agent_id,
356
- "status": "running",
357
- "start_mode": start_mode,
358
- "session_id": agent_state.get("session_id"),
359
- "target": target,
360
- "display_target": agent_state.get("display"),
361
- "delivered_messages": delivered_messages,
362
- "coordinator": coordinator,
363
- }
@@ -1,42 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from team_agent import runtime
4
- from team_agent.mcp_server.contracts import TOOLS
5
- from team_agent.mcp_server.normalize import (
6
- _compact_tool_result,
7
- _normalize_report_envelope,
8
- _items,
9
- _text,
10
- _first_text,
11
- _normalize_result_status,
12
- _normalize_changes,
13
- _normalize_change_kind,
14
- _normalize_tests,
15
- _normalize_test_status,
16
- _normalize_risks,
17
- _normalize_artifacts,
18
- _normalize_next_actions,
19
- )
20
- from team_agent.mcp_server.server import dispatch, handle_mcp, main
21
- from team_agent.mcp_server.tools import TeamOrchestratorTools
22
-
23
- __all__ = [
24
- 'TeamOrchestratorTools',
25
- 'TOOLS',
26
- 'dispatch',
27
- 'handle_mcp',
28
- 'main',
29
- '_compact_tool_result',
30
- '_normalize_report_envelope',
31
- '_items',
32
- '_text',
33
- '_first_text',
34
- '_normalize_result_status',
35
- '_normalize_changes',
36
- '_normalize_change_kind',
37
- '_normalize_tests',
38
- '_normalize_test_status',
39
- '_normalize_risks',
40
- '_normalize_artifacts',
41
- '_normalize_next_actions',
42
- ]
@@ -1,7 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from team_agent.mcp_server.server import main
4
-
5
-
6
- if __name__ == "__main__":
7
- main()
@@ -1,148 +0,0 @@
1
- from __future__ import annotations
2
-
3
-
4
- TOOLS = [
5
- {
6
- "name": "assign_task",
7
- "description": "Add or update a task in the team graph and deliver it to its assignee.",
8
- "inputSchema": {
9
- "type": "object",
10
- "required": ["task"],
11
- "properties": {
12
- "task": {"type": "object"},
13
- "message": {"type": "string"},
14
- },
15
- },
16
- },
17
- {
18
- "name": "send_message",
19
- "description": "Send a message to a teammate, the leader, or '*' for all other team members. Provide only target and content; Team Agent fills sender, task id, ack policy, and delivery metadata.",
20
- "inputSchema": {
21
- "type": "object",
22
- "required": ["to", "content"],
23
- "properties": {
24
- "to": {
25
- "oneOf": [
26
- {"type": "string"},
27
- {"type": "array", "items": {"type": "string"}, "minItems": 1},
28
- ]
29
- },
30
- "content": {"type": "string"},
31
- },
32
- "additionalProperties": False,
33
- },
34
- },
35
- {
36
- "name": "report_result",
37
- "description": "Report task completion. Provide a short summary and optional status/details; Team Agent fills schema_version, task_id, and agent_id, and normalizes common change/test field aliases.",
38
- "inputSchema": {
39
- "type": "object",
40
- "required": ["summary"],
41
- "properties": {
42
- "summary": {"type": "string"},
43
- "status": {"type": "string", "enum": ["success", "blocked", "failed", "partial"]},
44
- "changes": {"type": "array", "items": {"type": "object"}},
45
- "tests": {"type": "array", "items": {"type": "object"}},
46
- "risks": {"type": "array", "items": {"type": "object"}},
47
- "artifacts": {"type": "array", "items": {"type": "object"}},
48
- "next_actions": {"type": "array", "items": {"type": "object"}},
49
- },
50
- "additionalProperties": False,
51
- },
52
- },
53
- {
54
- "name": "update_state",
55
- "description": "Append a note to team state and rewrite team_state.md.",
56
- "inputSchema": {
57
- "type": "object",
58
- "required": ["note"],
59
- "properties": {"note": {"type": "string"}},
60
- },
61
- },
62
- {
63
- "name": "get_team_status",
64
- "description": "Return machine-readable team status.",
65
- "inputSchema": {"type": "object", "properties": {}},
66
- },
67
- {
68
- "name": "stop_agent",
69
- "description": "Hard-stop one running worker while preserving its session for start_agent resume.",
70
- "inputSchema": {
71
- "type": "object",
72
- "required": ["agent_id"],
73
- "properties": {"agent_id": {"type": "string"}},
74
- "additionalProperties": False,
75
- },
76
- },
77
- {
78
- "name": "reset_agent",
79
- "description": "Reset one worker to a fresh session. discard_session must be true.",
80
- "inputSchema": {
81
- "type": "object",
82
- "required": ["agent_id", "discard_session"],
83
- "properties": {
84
- "agent_id": {"type": "string"},
85
- "discard_session": {"type": "boolean"},
86
- },
87
- "additionalProperties": False,
88
- },
89
- },
90
- {
91
- "name": "add_agent",
92
- "description": "Add a first-class worker from a workspace-relative role file.",
93
- "inputSchema": {
94
- "type": "object",
95
- "required": ["new_agent_id", "role_file_path"],
96
- "properties": {
97
- "new_agent_id": {"type": "string"},
98
- "role_file_path": {"type": "string"},
99
- },
100
- "additionalProperties": False,
101
- },
102
- },
103
- {
104
- "name": "fork_agent",
105
- "description": "Fork a running worker using the provider's native branch/fork support.",
106
- "inputSchema": {
107
- "type": "object",
108
- "required": ["source_agent_id", "as_agent_id"],
109
- "properties": {
110
- "source_agent_id": {"type": "string"},
111
- "as_agent_id": {"type": "string"},
112
- "label": {"type": "string"},
113
- },
114
- "additionalProperties": False,
115
- },
116
- },
117
- {
118
- "name": "request_human",
119
- "description": "Ask the leader/user for human input.",
120
- "inputSchema": {
121
- "type": "object",
122
- "required": ["question"],
123
- "properties": {
124
- "question": {"type": "string"},
125
- "task_id": {"type": "string"},
126
- "agent_id": {"type": "string"},
127
- },
128
- },
129
- },
130
- {
131
- "name": "stuck_list",
132
- "description": "List manually suppressed idle-triggered alerts for this team.",
133
- "inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
134
- },
135
- {
136
- "name": "stuck_cancel",
137
- "description": "Suppress repeated stuck/idle alerts for one agent until meaningful agent state changes.",
138
- "inputSchema": {
139
- "type": "object",
140
- "required": ["agent_id"],
141
- "properties": {
142
- "agent_id": {"type": "string"},
143
- "alert_type": {"type": "string", "enum": ["stuck", "idle_fallback", "all"]},
144
- },
145
- "additionalProperties": False,
146
- },
147
- },
148
- ]