@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
@@ -0,0 +1,293 @@
1
+ #![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
2
+ use super::*;
3
+ use std::collections::BTreeMap;
4
+ use std::path::{Path, PathBuf};
5
+
6
+ use crate::transport::{
7
+ AttachOutcome, BackendKind, CaptureRange, CapturedText, InjectPayload, InjectReport, Key,
8
+ PaneField, PaneInfo, PaneLiveness, SessionName, SetEnvOutcome, SpawnResult, TransportError,
9
+ WindowName,
10
+ };
11
+
12
+ // ── test scaffolding ────────────────────────────────────────────────────
13
+
14
+ /// Unique throwaway workspace dir (DB / event-log writes never leak between tests).
15
+ fn tmp_ws(tag: &str) -> PathBuf {
16
+ use std::sync::atomic::{AtomicU64, Ordering};
17
+ static N: AtomicU64 = AtomicU64::new(0);
18
+ let n = N.fetch_add(1, Ordering::Relaxed);
19
+ let p = std::env::temp_dir().join(format!("ta-rs-msg-{tag}-{n}-{}", std::process::id()));
20
+ std::fs::create_dir_all(&p).unwrap();
21
+ p
22
+ }
23
+
24
+ fn store_for(ws: &Path) -> MessageStore {
25
+ MessageStore::open(ws).unwrap()
26
+ }
27
+
28
+ /// Minimal Transport: every method `unimplemented!()`. The fn-under-test panics
29
+ /// at its own `unimplemented!()` before reaching the transport, so this is never
30
+ /// actually driven — it exists only to satisfy `&dyn Transport` parameters.
31
+ struct NoopTransport;
32
+ impl Transport for NoopTransport {
33
+ fn kind(&self) -> BackendKind {
34
+ BackendKind::Tmux
35
+ }
36
+ fn spawn_first(
37
+ &self,
38
+ _s: &SessionName,
39
+ _w: &WindowName,
40
+ _a: &[String],
41
+ _c: &Path,
42
+ _e: &BTreeMap<String, String>,
43
+ ) -> Result<SpawnResult, TransportError> {
44
+ unimplemented!("noop")
45
+ }
46
+ fn spawn_into(
47
+ &self,
48
+ _s: &SessionName,
49
+ _w: &WindowName,
50
+ _a: &[String],
51
+ _c: &Path,
52
+ _e: &BTreeMap<String, String>,
53
+ ) -> Result<SpawnResult, TransportError> {
54
+ unimplemented!("noop")
55
+ }
56
+ fn inject(
57
+ &self,
58
+ _t: &Target,
59
+ _p: &InjectPayload,
60
+ _s: Key,
61
+ _b: bool,
62
+ ) -> Result<InjectReport, TransportError> {
63
+ unimplemented!("noop")
64
+ }
65
+ fn send_keys(&self, _t: &Target, _k: &[Key]) -> Result<(), TransportError> {
66
+ unimplemented!("noop")
67
+ }
68
+ fn capture(&self, _t: &Target, _r: CaptureRange) -> Result<CapturedText, TransportError> {
69
+ unimplemented!("noop")
70
+ }
71
+ fn query(&self, _t: &Target, _f: PaneField) -> Result<Option<String>, TransportError> {
72
+ unimplemented!("noop")
73
+ }
74
+ fn liveness(&self, _p: &PaneId) -> Result<PaneLiveness, TransportError> {
75
+ unimplemented!("noop")
76
+ }
77
+ fn list_targets(&self) -> Result<Vec<PaneInfo>, TransportError> {
78
+ unimplemented!("noop")
79
+ }
80
+ fn has_session(&self, _s: &SessionName) -> Result<bool, TransportError> {
81
+ unimplemented!("noop")
82
+ }
83
+ fn list_windows(&self, _s: &SessionName) -> Result<Vec<WindowName>, TransportError> {
84
+ unimplemented!("noop")
85
+ }
86
+ fn set_session_env(
87
+ &self,
88
+ _s: &SessionName,
89
+ _k: &str,
90
+ _v: &str,
91
+ ) -> Result<SetEnvOutcome, TransportError> {
92
+ unimplemented!("noop")
93
+ }
94
+ fn kill_session(&self, _s: &SessionName) -> Result<(), TransportError> {
95
+ unimplemented!("noop")
96
+ }
97
+ fn kill_window(&self, _t: &Target) -> Result<(), TransportError> {
98
+ unimplemented!("noop")
99
+ }
100
+ fn attach_session(&self, _s: &SessionName) -> Result<AttachOutcome, TransportError> {
101
+ unimplemented!("noop")
102
+ }
103
+ }
104
+
105
+ /// A `CommsSelftestDriver` mock that asserts the §84 / MUST-NOT-13 mechanical gate:
106
+ /// ZERO provider SDK clients on the selftest path. `provider_sdk_calls` MUST stay all-0.
107
+ struct ZeroSdkDriver {
108
+ run_id: Option<String>,
109
+ calls: ProviderSdkCalls,
110
+ }
111
+ impl CommsSelftestDriver for ZeroSdkDriver {
112
+ fn run_id(&self) -> Option<String> {
113
+ self.run_id.clone()
114
+ }
115
+ fn provider_sdk_calls(&self) -> ProviderSdkCalls {
116
+ self.calls
117
+ }
118
+ fn receiver_binding(&self, _ws: &Path, _team: Option<&TeamKey>) -> serde_json::Value {
119
+ serde_json::json!({
120
+ "status": "pass",
121
+ "verifies": "binding_consistency",
122
+ "proof": "state_read",
123
+ "state_read_observed": true,
124
+ "mismatches": [],
125
+ })
126
+ }
127
+ }
128
+
129
+ fn json(v: serde_json::Value) -> serde_json::Value {
130
+ v
131
+ }
132
+
133
+ // ── MessageStore seed helpers ────────────────────────────────────────────
134
+ //
135
+ // step-7 MessageStore only exposes create_message / claim_for_delivery /
136
+ // claim_leader_notification_delivery; the daemon-path fns under test also read
137
+ // result_watchers / scheduled_events / results rows that step-7 does not yet
138
+ // expose typed inserts for. These helpers seed those rows DIRECTLY via the
139
+ // same team.db the store opened (db::schema::open_db on store.db_path()),
140
+ // mirroring the on-disk columns probed from team-agent-public @ 439bef8
141
+ // (message_store/core.py:272-330, result_watchers.py:14-72, core.py:366).
142
+ // They exist ONLY so the WEAK "empty store → empty" contracts can run against
143
+ // a SEEDED fixture and assert concrete dedupe/dispatch outcomes.
144
+
145
+ use rusqlite::params as sql_params;
146
+
147
+ /// Open a fresh read/write connection onto the store's backing team.db
148
+ /// (the store keeps no live connection; every op reopens, so seeds are visible).
149
+ fn seed_conn(store: &MessageStore) -> rusqlite::Connection {
150
+ crate::db::schema::open_db(store.db_path()).unwrap()
151
+ }
152
+
153
+ /// Seed a `result_watchers` row. `notified_message_id = Some(_)` marks the
154
+ /// watcher as ALREADY notified (Gap-32 dedupe gate: must survive a requeue and
155
+ /// block redelivery). `status` is the watcher lifecycle state
156
+ /// (`pending` / `notify_failed` / …). Returns the watcher_id.
157
+ #[allow(clippy::too_many_arguments)]
158
+ fn seed_watcher(
159
+ store: &MessageStore,
160
+ watcher_id: &str,
161
+ owner_team_id: &str,
162
+ task_id: &str,
163
+ agent_id: &str,
164
+ status: &str,
165
+ result_id: Option<&str>,
166
+ notified_message_id: Option<&str>,
167
+ ) -> String {
168
+ let conn = seed_conn(store);
169
+ conn.execute(
170
+ "insert into result_watchers(
171
+ watcher_id, owner_team_id, task_id, agent_id, message_id, leader_id,
172
+ status, created_at, completed_at, result_id, notified_message_id, error
173
+ ) values (?1, ?2, ?3, ?4, null, 'leader', ?5, ?6, null, ?7, ?8, null)",
174
+ sql_params![
175
+ watcher_id,
176
+ owner_team_id,
177
+ task_id,
178
+ agent_id,
179
+ status,
180
+ "2026-06-02T10:00:00+00:00",
181
+ result_id,
182
+ notified_message_id,
183
+ ],
184
+ )
185
+ .unwrap();
186
+ watcher_id.to_string()
187
+ }
188
+
189
+ /// Read back a watcher's `(status, notified_message_id)` — used to assert the
190
+ /// Gap-32 survival invariant (a notified watcher must keep its id after requeue).
191
+ fn watcher_state(store: &MessageStore, watcher_id: &str) -> (String, Option<String>) {
192
+ let conn = seed_conn(store);
193
+ conn.query_row(
194
+ "select status, notified_message_id from result_watchers where watcher_id = ?1",
195
+ sql_params![watcher_id],
196
+ |r| Ok((r.get::<_, String>(0)?, r.get::<_, Option<String>>(1)?)),
197
+ )
198
+ .unwrap()
199
+ }
200
+
201
+ /// Seed a `scheduled_events` row of the given [`ScheduledKind`], DUE in the past
202
+ /// (`status='pending'`, `due_at` < now) so `due_scheduled_events` selects it.
203
+ /// Returns the autoincrement event id (the value `fire_due_scheduled_events`
204
+ /// appends to its fired list). scheduler.py:41-121 fires each due kind exhaustively.
205
+ fn seed_scheduled_event(
206
+ store: &MessageStore,
207
+ kind: ScheduledKind,
208
+ target: &str,
209
+ payload: &serde_json::Value,
210
+ ) -> i64 {
211
+ let kind_wire = serde_json::to_value(kind).unwrap();
212
+ let kind_str = kind_wire.as_str().unwrap();
213
+ let conn = seed_conn(store);
214
+ conn.execute(
215
+ "insert into scheduled_events(
216
+ owner_team_id, due_at, target, kind, payload_json, status, created_at
217
+ ) values (null, ?1, ?2, ?3, ?4, 'pending', ?5)",
218
+ sql_params![
219
+ "2000-01-01T00:00:00+00:00", // far past → always due
220
+ target,
221
+ kind_str,
222
+ payload.to_string(),
223
+ "2000-01-01T00:00:00+00:00",
224
+ ],
225
+ )
226
+ .unwrap();
227
+ conn.last_insert_rowid()
228
+ }
229
+
230
+ /// Seed a `results` row (an uncollected result envelope) so `retry_result_deliveries`
231
+ /// can resolve a watcher's `result_id` via `result_by_id`. Returns the result_id.
232
+ fn seed_result(
233
+ store: &MessageStore,
234
+ result_id: &str,
235
+ task_id: &str,
236
+ agent_id: &str,
237
+ status: &str,
238
+ ) -> String {
239
+ let envelope = serde_json::json!({
240
+ "schema_version": "result_envelope_v1",
241
+ "result_id": result_id,
242
+ "task_id": task_id,
243
+ "agent_id": agent_id,
244
+ "status": status,
245
+ "summary": "done",
246
+ "changes": [], "tests": [], "risks": [], "artifacts": [], "next_actions": []
247
+ });
248
+ let conn = seed_conn(store);
249
+ conn.execute(
250
+ "insert into results(
251
+ result_id, owner_team_id, task_id, agent_id, envelope, status, created_at
252
+ ) values (?1, null, ?2, ?3, ?4, ?5, ?6)",
253
+ sql_params![
254
+ result_id,
255
+ task_id,
256
+ agent_id,
257
+ envelope.to_string(),
258
+ status,
259
+ "2026-06-02T10:00:00+00:00",
260
+ ],
261
+ )
262
+ .unwrap();
263
+ result_id.to_string()
264
+ }
265
+
266
+ static ENV_LOCK_MSG: std::sync::Mutex<()> = std::sync::Mutex::new(());
267
+ struct EnvGuardMsg {
268
+ key: String,
269
+ prev: Option<String>,
270
+ }
271
+ impl EnvGuardMsg {
272
+ fn set(key: &str, val: Option<&str>) -> Self {
273
+ let prev = std::env::var(key).ok();
274
+ match val {
275
+ Some(v) => std::env::set_var(key, v),
276
+ None => std::env::remove_var(key),
277
+ }
278
+ Self { key: key.to_string(), prev }
279
+ }
280
+ }
281
+ impl Drop for EnvGuardMsg {
282
+ fn drop(&mut self) {
283
+ match &self.prev {
284
+ Some(v) => std::env::set_var(&self.key, v),
285
+ None => std::env::remove_var(&self.key),
286
+ }
287
+ }
288
+ }
289
+
290
+ mod basic;
291
+ mod runtime;
292
+ mod spine;
293
+ mod main_preserved;