@team-agent/installer 0.5.112 → 0.5.114

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 (77) hide show
  1. package/Cargo.lock +252 -84
  2. package/Cargo.toml +3 -1
  3. package/crates/team-agent/Cargo.toml +3 -0
  4. package/crates/team-agent/src/cli/adapters.rs +119 -50
  5. package/crates/team-agent/src/cli/diagnose.rs +36 -13
  6. package/crates/team-agent/src/cli/emit.rs +173 -109
  7. package/crates/team-agent/src/cli/leader.rs +16 -0
  8. package/crates/team-agent/src/cli/leader_prompt.rs +261 -0
  9. package/crates/team-agent/src/cli/leaders.rs +32 -32
  10. package/crates/team-agent/src/cli/mod.rs +158 -14
  11. package/crates/team-agent/src/cli/models.rs +68 -18
  12. package/crates/team-agent/src/cli/named_address.rs +17 -16
  13. package/crates/team-agent/src/cli/route.rs +4 -4
  14. package/crates/team-agent/src/cli/send/presentation.rs +19 -18
  15. package/crates/team-agent/src/cli/send/resolve.rs +11 -11
  16. package/crates/team-agent/src/cli/send.rs +4 -4
  17. package/crates/team-agent/src/cli/spec.rs +35 -29
  18. package/crates/team-agent/src/cli/status.rs +7 -7
  19. package/crates/team-agent/src/cli/status_port/brief.rs +268 -101
  20. package/crates/team-agent/src/cli/tests/base.rs +94 -6
  21. package/crates/team-agent/src/cli/tests/divergence.rs +3 -2
  22. package/crates/team-agent/src/cli/tests/lane_c.rs +1 -1
  23. package/crates/team-agent/src/cli/tests/named_address.rs +3 -3
  24. package/crates/team-agent/src/cli/tests/status_send.rs +9 -7
  25. package/crates/team-agent/src/cli/triage.rs +53 -2
  26. package/crates/team-agent/src/cli/types.rs +8 -8
  27. package/crates/team-agent/src/compiler/tests.rs +12 -0
  28. package/crates/team-agent/src/compiler.rs +65 -26
  29. package/crates/team-agent/src/contract_runtime/backend.rs +646 -0
  30. package/crates/team-agent/src/contract_runtime/config.rs +309 -0
  31. package/crates/team-agent/src/contract_runtime/discovery.rs +237 -0
  32. package/crates/team-agent/src/contract_runtime/forward.rs +229 -0
  33. package/crates/team-agent/src/contract_runtime/framework.rs +261 -0
  34. package/crates/team-agent/src/contract_runtime/mcp.rs +396 -0
  35. package/crates/team-agent/src/contract_runtime/mod.rs +14 -0
  36. package/crates/team-agent/src/contract_runtime/prompt.rs +216 -0
  37. package/crates/team-agent/src/contract_runtime/pump.rs +207 -0
  38. package/crates/team-agent/src/contract_runtime/registry.rs +30 -0
  39. package/crates/team-agent/src/coordinator/tick.rs +26 -8
  40. package/crates/team-agent/src/leader/mod.rs +1 -0
  41. package/crates/team-agent/src/leader/prompt.rs +906 -0
  42. package/crates/team-agent/src/leader/start.rs +265 -16
  43. package/crates/team-agent/src/leader/tests/identity.rs +21 -0
  44. package/crates/team-agent/src/leader/tests/mod.rs +2 -0
  45. package/crates/team-agent/src/leader/tests/prompt_contract.rs +268 -0
  46. package/crates/team-agent/src/leader/types.rs +6 -0
  47. package/crates/team-agent/src/lib.rs +4 -0
  48. package/crates/team-agent/src/lifecycle/launch/identity.rs +172 -13
  49. package/crates/team-agent/src/lifecycle/launch/quick_start.rs +760 -365
  50. package/crates/team-agent/src/lifecycle/launch/spawn.rs +38 -9
  51. package/crates/team-agent/src/lifecycle/launch/state_projection.rs +17 -0
  52. package/crates/team-agent/src/lifecycle/launch.rs +39 -28
  53. package/crates/team-agent/src/lifecycle/profile_launch.rs +58 -46
  54. package/crates/team-agent/src/lifecycle/restart/rebuild.rs +97 -52
  55. package/crates/team-agent/src/lifecycle/restart.rs +1 -1
  56. package/crates/team-agent/src/lifecycle/tests/stale_team_saveconflict_contract.rs +3 -2
  57. package/crates/team-agent/src/lifecycle/types.rs +4 -1
  58. package/crates/team-agent/src/lifecycle/worker_command_context.rs +37 -27
  59. package/crates/team-agent/src/main.rs +6 -0
  60. package/crates/team-agent/src/messaging/delivery.rs +50 -1
  61. package/crates/team-agent/src/messaging/send.rs +10 -0
  62. package/crates/team-agent/src/messaging/tests/leader_inject_acceptance.rs +131 -0
  63. package/crates/team-agent/src/model/spec.rs +24 -12
  64. package/crates/team-agent/src/provider/adapter.rs +8 -59
  65. package/crates/team-agent/src/provider/adapters/claude.rs +6 -14
  66. package/crates/team-agent/src/provider/adapters/codex.rs +8 -18
  67. package/crates/team-agent/src/provider/adapters/copilot.rs +5 -22
  68. package/crates/team-agent/src/provider/adapters/cursor_agent.rs +8 -45
  69. package/crates/team-agent/src/provider/adapters/grok.rs +7 -31
  70. package/crates/team-agent/src/provider/adapters/pi.rs +7 -18
  71. package/crates/team-agent/src/provider/command_helpers.rs +45 -0
  72. package/crates/team-agent/src/provider/mod.rs +1 -0
  73. package/crates/team-agent/src/provider/model_catalog.rs +21 -28
  74. package/crates/team-agent/src/provider/tests/adapter.rs +70 -0
  75. package/crates/team-agent/src/provider/tests/command_helpers.rs +55 -0
  76. package/crates/team-agent/src/state/persist.rs +73 -0
  77. package/package.json +4 -4
@@ -1333,6 +1333,15 @@ fn lifecycle_placeholder(agent: &Value) -> bool {
1333
1333
  }
1334
1334
 
1335
1335
  fn lifecycle_peer_snapshot_is_stale(incoming: &Value, latest: &Value) -> bool {
1336
+ // A save that omitted a not-yet-spawned peer can carry roster_stub's
1337
+ // metadata-only row into a later save. It has neither status nor epoch;
1338
+ // it must not conflict with the peer that has since started.
1339
+ if incoming.get("status").is_none_or(Value::is_null)
1340
+ && live_topology_fields(incoming).is_empty()
1341
+ && latest.get("status").and_then(Value::as_str) == Some("running")
1342
+ {
1343
+ return true;
1344
+ }
1336
1345
  // A concurrent clone/restart can have promoted its peer to `running`
1337
1346
  // while its capture tuple is still pending. That row is still a
1338
1347
  // lifecycle snapshot, not a completed topology observation; preserving
@@ -2643,6 +2652,70 @@ mod tests {
2643
2652
  assert!(saved["agents"].get("f2").is_some());
2644
2653
  }
2645
2654
 
2655
+ #[test]
2656
+ fn lifecycle_authority_preserves_peer_that_started_after_roster_stub_snapshot() {
2657
+ let ws = temp_ws();
2658
+ write_state(
2659
+ &ws,
2660
+ &json!({
2661
+ "session_name": "team-a",
2662
+ "active_team_key": "team-a",
2663
+ "agents": {"f1": {"provider": "claude", "status": "starting"}}
2664
+ }),
2665
+ );
2666
+ // f2 loaded before f1's reservation. Persist carries the still-unspawned
2667
+ // f1 forward as an actual roster stub, not a fabricated test shape.
2668
+ let incoming = json!({
2669
+ "session_name": "team-a",
2670
+ "active_team_key": "team-a",
2671
+ "agents": {"f2": {"provider": "claude", "status": "starting"}}
2672
+ });
2673
+ save_runtime_state_with_lifecycle_topology_authority(&ws, &incoming, "team-a", &["f2"])
2674
+ .unwrap();
2675
+ let mut stale = read_state(&ws);
2676
+ assert!(stale["agents"]["f1"].get("status").is_none());
2677
+ assert!(live_topology_fields(&stale["agents"]["f1"]).is_empty());
2678
+
2679
+ // f1 starts after f2 takes its snapshot; capture is not complete yet.
2680
+ let mut started = stale.clone();
2681
+ started["agents"]["f1"] = json!({
2682
+ "provider": "claude",
2683
+ "status": "running",
2684
+ "pane_id": "%1",
2685
+ "pane_pid": 101,
2686
+ "window": "f1",
2687
+ "spawned_at": "2026-10-11T05:55:20Z",
2688
+ "spawn_epoch": 1,
2689
+ "_pending_session_id": "session-f1"
2690
+ });
2691
+ normalize_agent_session_state(&mut started);
2692
+ save_runtime_state_with_lifecycle_topology_authority(&ws, &started, "team-a", &["f1"])
2693
+ .unwrap();
2694
+ let latest = read_state(&ws);
2695
+ stale["agents"]["f2"] = json!({
2696
+ "provider": "claude",
2697
+ "status": "running",
2698
+ "pane_id": "%2",
2699
+ "pane_pid": 102,
2700
+ "window": "f2",
2701
+ "spawned_at": "2026-10-11T05:55:21Z",
2702
+ "spawn_epoch": 1,
2703
+ "_pending_session_id": "session-f2"
2704
+ });
2705
+
2706
+ // Ordinary writers still cannot overwrite the live peer from a stub.
2707
+ assert!(matches!(
2708
+ save_runtime_state(&ws, &stale),
2709
+ Err(StateError::SaveConflict(_))
2710
+ ));
2711
+ assert_eq!(read_state(&ws), latest);
2712
+ save_runtime_state_with_lifecycle_topology_authority(&ws, &stale, "team-a", &["f2"])
2713
+ .unwrap();
2714
+ let saved = read_state(&ws);
2715
+ assert_eq!(saved["agents"]["f1"], latest["agents"]["f1"]);
2716
+ assert_eq!(saved["agents"]["f2"], stale["agents"]["f2"]);
2717
+ }
2718
+
2646
2719
  #[test]
2647
2720
  fn lifecycle_authority_preserves_complete_latest_row_for_starting_peer() {
2648
2721
  let ws = temp_ws();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-agent/installer",
3
- "version": "0.5.112",
3
+ "version": "0.5.114",
4
4
  "description": "npx installer for Team Agent",
5
5
  "keywords": [
6
6
  "codex",
@@ -20,9 +20,9 @@
20
20
  "team-agent-installer": "npm/install.mjs"
21
21
  },
22
22
  "optionalDependencies": {
23
- "@team-agent/cli-darwin-arm64": "0.5.112",
24
- "@team-agent/cli-darwin-x64": "0.5.112",
25
- "@team-agent/cli-linux-x64": "0.5.112"
23
+ "@team-agent/cli-darwin-arm64": "0.5.114",
24
+ "@team-agent/cli-darwin-x64": "0.5.114",
25
+ "@team-agent/cli-linux-x64": "0.5.114"
26
26
  },
27
27
  "scripts": {
28
28
  "postinstall": "node npm/bincheck.mjs",