@team-agent/installer 0.5.65 → 0.5.68
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.
- package/Cargo.lock +8 -1
- package/Cargo.toml +1 -1
- package/crates/team-agent/Cargo.toml +6 -0
- package/crates/team-agent/src/cli/adapters.rs +6 -1
- package/crates/team-agent/src/cli/diagnose.rs +82 -0
- package/crates/team-agent/src/cli/emit.rs +3 -3
- package/crates/team-agent/src/cli/grok_slot.rs +299 -0
- package/crates/team-agent/src/cli/leader.rs +21 -7
- package/crates/team-agent/src/cli/leaders.rs +125 -1
- package/crates/team-agent/src/cli/mod.rs +20 -0
- package/crates/team-agent/src/cli/send/presentation.rs +7 -1
- package/crates/team-agent/src/cli/spec.rs +2 -0
- package/crates/team-agent/src/cli/status_port/compact.rs +28 -0
- package/crates/team-agent/src/cli/status_port/snapshot.rs +25 -1
- package/crates/team-agent/src/cli/tests/base.rs +26 -3
- package/crates/team-agent/src/cli/tests/compile.rs +1 -1
- package/crates/team-agent/src/cli/tests/missing_subcommands.rs +129 -19
- package/crates/team-agent/src/cli/tests/mod.rs +2 -2
- package/crates/team-agent/src/cli/tests/run_delegation.rs +1 -1
- package/crates/team-agent/src/cli/tests/shutdown_kill_plan.rs +387 -6
- package/crates/team-agent/src/cli/tests/status_send.rs +79 -10
- package/crates/team-agent/src/cli/tests/verb_validate.rs +1 -1
- package/crates/team-agent/src/communication_mode/mod.rs +6 -4
- package/crates/team-agent/src/compiler/tests.rs +23 -20
- package/crates/team-agent/src/compiler.rs +84 -5
- package/crates/team-agent/src/conpty/backend.rs +16 -0
- package/crates/team-agent/src/coordinator/backoff.rs +55 -0
- package/crates/team-agent/src/coordinator/conpty_shim.rs +82 -0
- package/crates/team-agent/src/coordinator/health.rs +173 -0
- package/crates/team-agent/src/coordinator/mod.rs +31 -0
- package/crates/team-agent/src/coordinator/orphan.rs +31 -0
- package/crates/team-agent/src/coordinator/runtime_detectors.rs +30 -0
- package/crates/team-agent/src/coordinator/runtime_observation.rs +25 -0
- package/crates/team-agent/src/coordinator/steps/abnormal.rs +59 -0
- package/crates/team-agent/src/coordinator/steps/delivery.rs +10 -0
- package/crates/team-agent/src/coordinator/steps/health_sync.rs +10 -0
- package/crates/team-agent/src/coordinator/steps/mod.rs +22 -0
- package/crates/team-agent/src/coordinator/steps/persist.rs +10 -0
- package/crates/team-agent/src/coordinator/steps/runtime_prompts.rs +10 -0
- package/crates/team-agent/src/coordinator/steps/session_gate.rs +10 -0
- package/crates/team-agent/src/coordinator/tick.rs +133 -22
- package/crates/team-agent/src/coordinator/types.rs +49 -0
- package/crates/team-agent/src/db/message_store.rs +39 -5
- package/crates/team-agent/src/layout/worker_env.rs +20 -3
- package/crates/team-agent/src/layout/worker_window_helpers.rs +2 -0
- package/crates/team-agent/src/leader/provider_attribution.rs +53 -0
- package/crates/team-agent/src/leader/registry.rs +65 -0
- package/crates/team-agent/src/leader/start.rs +1080 -58
- package/crates/team-agent/src/leader/tests/team_in_team_state_scope_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/display.rs +56 -0
- package/crates/team-agent/src/lifecycle/helpers.rs +57 -0
- package/crates/team-agent/src/lifecycle/launch/add_agent.rs +332 -14
- package/crates/team-agent/src/lifecycle/launch/add_agent_state.rs +69 -2
- package/crates/team-agent/src/lifecycle/launch/agent_state.rs +196 -2
- package/crates/team-agent/src/lifecycle/launch/clone_agent.rs +101 -11
- package/crates/team-agent/src/lifecycle/launch/cursor_create_chat.rs +229 -0
- package/crates/team-agent/src/lifecycle/launch/cursor_mcp.rs +332 -0
- package/crates/team-agent/src/lifecycle/launch/fork_agent.rs +204 -457
- package/crates/team-agent/src/lifecycle/launch/fork_entry.rs +24 -0
- package/crates/team-agent/src/lifecycle/launch/grok_per_seat.rs +260 -0
- package/crates/team-agent/src/lifecycle/launch/identity.rs +146 -0
- package/crates/team-agent/src/lifecycle/launch/layout.rs +60 -0
- package/crates/team-agent/src/lifecycle/launch/leader_context.rs +112 -0
- package/crates/team-agent/src/lifecycle/launch/mcp_config.rs +530 -0
- package/crates/team-agent/src/lifecycle/launch/ownership.rs +40 -0
- package/crates/team-agent/src/lifecycle/launch/plan.rs +31 -0
- package/crates/team-agent/src/lifecycle/launch/quick_start.rs +66 -0
- package/crates/team-agent/src/lifecycle/launch/quick_start_transport.rs +78 -0
- package/crates/team-agent/src/lifecycle/launch/readiness.rs +85 -38
- package/crates/team-agent/src/lifecycle/launch/role_source.rs +44 -44
- package/crates/team-agent/src/lifecycle/launch/spawn.rs +101 -4
- package/crates/team-agent/src/lifecycle/launch/spec_state.rs +244 -48
- package/crates/team-agent/src/lifecycle/launch/state_projection.rs +109 -2
- package/crates/team-agent/src/lifecycle/launch/worker_env.rs +214 -1
- package/crates/team-agent/src/lifecycle/launch.rs +209 -43
- package/crates/team-agent/src/lifecycle/lock.rs +42 -1
- package/crates/team-agent/src/lifecycle/mod.rs +11 -0
- package/crates/team-agent/src/lifecycle/pane_input_lock.rs +161 -0
- package/crates/team-agent/src/lifecycle/profile_launch.rs +98 -0
- package/crates/team-agent/src/lifecycle/profile_smoke.rs +51 -1
- package/crates/team-agent/src/lifecycle/restart/agent.rs +213 -3
- package/crates/team-agent/src/lifecycle/restart/common.rs +373 -18
- package/crates/team-agent/src/lifecycle/restart/orchestrator.rs +27 -0
- package/crates/team-agent/src/lifecycle/restart/preflight.rs +25 -0
- package/crates/team-agent/src/lifecycle/restart/rebuild.rs +165 -15
- package/crates/team-agent/src/lifecycle/restart/remove.rs +196 -5
- package/crates/team-agent/src/lifecycle/restart/selection.rs +72 -0
- package/crates/team-agent/src/lifecycle/restart/team_state.rs +22 -0
- package/crates/team-agent/src/lifecycle/restart.rs +29 -0
- package/crates/team-agent/src/lifecycle/tests/acceptance_b_batch_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/agent_ops.rs +3 -4
- package/crates/team-agent/src/lifecycle/tests/behavioral_diff_264_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/claude_compatible_config_red.rs +2 -2
- package/crates/team-agent/src/lifecycle/tests/claude_profile_launch_red.rs +4 -4
- package/crates/team-agent/src/lifecycle/tests/clone_agent_preserves_source_tools.rs +309 -0
- package/crates/team-agent/src/lifecycle/tests/clone_fork_copilot_perms_red.rs +159 -174
- package/crates/team-agent/src/lifecycle/tests/communication_mode_runtime_contract_red.rs +2 -2
- package/crates/team-agent/src/lifecycle/tests/copilot_provider_red.rs +15 -13
- package/crates/team-agent/src/lifecycle/tests/core.rs +4 -18
- package/crates/team-agent/src/lifecycle/tests/core_034_real_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/cursor_mcp_overlay.rs +287 -0
- package/crates/team-agent/src/lifecycle/tests/cursor_require_explicit_model_red.rs +229 -0
- package/crates/team-agent/src/lifecycle/tests/cursor_restart_resume_red.rs +353 -0
- package/crates/team-agent/src/lifecycle/tests/display_adaptive_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/f032_startup_prompt_best_effort_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/g1_silent_faces.rs +784 -0
- package/crates/team-agent/src/lifecycle/tests/gate_fixtures.rs +562 -0
- package/crates/team-agent/src/lifecycle/tests/grok_effort_argv_red.rs +239 -0
- package/crates/team-agent/src/lifecycle/tests/grok_mcp_overlay_red.rs +498 -0
- package/crates/team-agent/src/lifecycle/tests/grok_require_explicit_model_red.rs +250 -0
- package/crates/team-agent/src/lifecycle/tests/grok_restart_resume_red.rs +293 -0
- package/crates/team-agent/src/lifecycle/tests/harvest2_a_batch_red.rs +3 -0
- package/crates/team-agent/src/lifecycle/tests/host_cotenant_death_p0_contract.rs +3 -3
- package/crates/team-agent/src/lifecycle/tests/lane_ops.rs +65 -40
- package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +20 -32
- package/crates/team-agent/src/lifecycle/tests/lifecycle_rollback_red.rs +17 -9
- package/crates/team-agent/src/lifecycle/tests/mcp_tool_name_format_red.rs +69 -0
- package/crates/team-agent/src/lifecycle/tests/phase_b_contracts.rs +24 -23
- package/crates/team-agent/src/lifecycle/tests/phase_golden.rs +98 -62
- package/crates/team-agent/src/lifecycle/tests/quick_start_worker_readiness_red.rs +2 -2
- package/crates/team-agent/src/lifecycle/tests/restart_build_before_destroy_0540_contract.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/restart_liveness_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/restart_rebind_hotfix_252_red.rs +3 -1
- package/crates/team-agent/src/lifecycle/tests/restart_session_capture_red.rs +2 -2
- package/crates/team-agent/src/lifecycle/tests/resume_recover_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/stale_team_saveconflict_contract.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/startup_latency_contract.rs +41 -8
- package/crates/team-agent/src/lifecycle/tests/status_credential_redaction_contract.rs +3 -3
- package/crates/team-agent/src/lifecycle/tests/subprep_codex_trust_roundtrip_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/swallow_batch4_semantics_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/team_in_team_identity_scope_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/team_in_team_sibling_quick_start_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/team_in_team_state_scope_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/team_key_retirement_txn_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/test_isolation_escape_contract.rs +60 -2
- package/crates/team-agent/src/lifecycle/tests/upgrade_compat_0211_red.rs +1 -1
- package/crates/team-agent/src/lifecycle/tests/verify_rs031_window_consistency_red.rs +2 -2
- package/crates/team-agent/src/lifecycle/tests/worker_spawn_env_red.rs +69 -26
- package/crates/team-agent/src/lifecycle/tests.rs +23 -15
- package/crates/team-agent/src/lifecycle/types.rs +61 -2
- package/crates/team-agent/src/lifecycle/worker_command_context.rs +200 -33
- package/crates/team-agent/src/mcp_server/tests/scoped.rs +100 -1
- package/crates/team-agent/src/mcp_server/tests.rs +196 -2
- package/crates/team-agent/src/messaging/delivery.rs +405 -40
- package/crates/team-agent/src/messaging/helpers.rs +2 -0
- package/crates/team-agent/src/messaging/leader_receiver.rs +53 -1
- package/crates/team-agent/src/messaging/results.rs +4 -0
- package/crates/team-agent/src/messaging/send.rs +34 -0
- package/crates/team-agent/src/messaging/tests/dup_inject.rs +406 -0
- package/crates/team-agent/src/messaging/tests/e23.rs +9 -0
- package/crates/team-agent/src/messaging/tests/leader_inject_acceptance.rs +66 -0
- package/crates/team-agent/src/messaging/tests/main_preserved.rs +1 -1
- package/crates/team-agent/src/messaging/tests/mod.rs +1 -0
- package/crates/team-agent/src/messaging/types.rs +4 -1
- package/crates/team-agent/src/model/enums.rs +14 -5
- package/crates/team-agent/src/model/permissions.rs +3 -0
- package/crates/team-agent/src/model/spec.rs +129 -6
- package/crates/team-agent/src/model/testdata/spec_invalid_a.yaml +3 -1
- package/crates/team-agent/src/model/testdata/team.spec.golden.yaml +3 -1
- package/crates/team-agent/src/model/testdata/team.spec.yaml +3 -1
- package/crates/team-agent/src/os_probe.rs +73 -2
- package/crates/team-agent/src/provider/adapter.rs +231 -4
- package/crates/team-agent/src/provider/adapters/claude.rs +5 -2
- package/crates/team-agent/src/provider/adapters/codex.rs +5 -2
- package/crates/team-agent/src/provider/adapters/copilot.rs +5 -2
- package/crates/team-agent/src/provider/adapters/cursor_agent.rs +86 -0
- package/crates/team-agent/src/provider/adapters/grok.rs +157 -0
- package/crates/team-agent/src/provider/adapters/mod.rs +2 -0
- package/crates/team-agent/src/provider/bypass_flags.rs +124 -0
- package/crates/team-agent/src/provider/classify.rs +4 -2
- package/crates/team-agent/src/provider/faults.rs +2 -1
- package/crates/team-agent/src/provider/mod.rs +13 -0
- package/crates/team-agent/src/provider/session/capture.rs +158 -20
- package/crates/team-agent/src/provider/session/context_fork/claude.rs +38 -1
- package/crates/team-agent/src/provider/session/context_fork/codex.rs +72 -1
- package/crates/team-agent/src/provider/session/context_fork/outcome.rs +57 -1
- package/crates/team-agent/src/provider/session/context_fork.rs +77 -3
- package/crates/team-agent/src/provider/session/mod.rs +18 -0
- package/crates/team-agent/src/provider/session/resume.rs +57 -0
- package/crates/team-agent/src/provider/session_scan/claude.rs +125 -1
- package/crates/team-agent/src/provider/session_scan/codex.rs +94 -1
- package/crates/team-agent/src/provider/session_scan/common.rs +204 -2
- package/crates/team-agent/src/provider/session_scan/copilot.rs +33 -1
- package/crates/team-agent/src/provider/session_scan/cursor.rs +538 -0
- package/crates/team-agent/src/provider/session_scan/grok.rs +288 -0
- package/crates/team-agent/src/provider/session_scan.rs +8 -0
- package/crates/team-agent/src/provider/submit_now.rs +94 -0
- package/crates/team-agent/src/provider/tests/adapter.rs +304 -0
- package/crates/team-agent/src/provider/types.rs +4 -2
- package/crates/team-agent/src/provider/wire.rs +23 -1
- package/crates/team-agent/src/state/persist.rs +301 -8
- package/crates/team-agent/src/state/repository.rs +5 -0
- package/crates/team-agent/src/tmux_backend/tests.rs +1737 -42
- package/crates/team-agent/src/tmux_backend.rs +1083 -75
- package/crates/team-agent/src/transport/test_support.rs +20 -0
- package/crates/team-agent/src/transport/tests/wire.rs +28 -2
- package/crates/team-agent/src/transport.rs +265 -1
- package/npm/install.mjs +129 -73
- package/package.json +4 -4
- package/skills/team-agent/SKILL.md +33 -238
- package/skills/team-agent/command-coverage.json +31 -0
- package/crates/team-agent/src/lifecycle/launch/approval.rs +0 -134
- package/crates/team-agent/src/lifecycle/launch/fork_agent/completion.rs +0 -59
- package/crates/team-agent/src/lifecycle/launch/fork_finalize.rs +0 -483
- package/crates/team-agent/src/lifecycle/launch/fork_pending.rs +0 -109
- package/crates/team-agent/src/lifecycle/launch/fork_state.rs +0 -447
- package/crates/team-agent/src/lifecycle/tests/codex_mcp_approval_inheritance_red.rs +0 -1187
- package/crates/team-agent/src/lifecycle/tests/worker_dangerous_bypass_argv_red.rs +0 -327
|
@@ -114,7 +114,8 @@ fn worker_spawn_scrubs_cross_provider_process_identity_but_keeps_config_env() {
|
|
|
114
114
|
("NODE_EXTRA_CA_CERTS", "/canary/ca.pem"),
|
|
115
115
|
]);
|
|
116
116
|
|
|
117
|
-
let launch_team =
|
|
117
|
+
let launch_team =
|
|
118
|
+
compiled_team_dir_for_provider("cross-launch", &[("worker_a", "Launch Worker")], "claude");
|
|
118
119
|
let launch_transport = RecordingTransport::new().with_session_present(false);
|
|
119
120
|
launch_with_transport(
|
|
120
121
|
&launch_team.join("team.spec.yaml"),
|
|
@@ -125,16 +126,25 @@ fn worker_spawn_scrubs_cross_provider_process_identity_but_keeps_config_env() {
|
|
|
125
126
|
)
|
|
126
127
|
.expect("launch fixture should spawn worker");
|
|
127
128
|
|
|
128
|
-
let restart_team =
|
|
129
|
-
|
|
129
|
+
let restart_team = compiled_team_dir_for_provider(
|
|
130
|
+
"cross-restart",
|
|
131
|
+
&[("worker_a", "Restart Worker")],
|
|
132
|
+
"claude",
|
|
133
|
+
);
|
|
134
|
+
seed_restart_state_as(&restart_team, "worker_a", "claude");
|
|
130
135
|
let restart_transport = RecordingTransport::new().with_session_present(false);
|
|
131
136
|
restart_with_transport(&restart_team, true, None, &restart_transport)
|
|
132
137
|
.expect("restart fixture should spawn worker");
|
|
133
138
|
|
|
134
|
-
let add_team =
|
|
135
|
-
|
|
139
|
+
let add_team =
|
|
140
|
+
compiled_team_dir_for_provider("cross-add", &[("worker_a", "Existing Worker")], "claude");
|
|
141
|
+
seed_running_add_agent_state_as(&add_team, "worker_a", "claude");
|
|
136
142
|
let role_file = add_team.parent().unwrap().join("worker_b.md");
|
|
137
|
-
std::fs::write(
|
|
143
|
+
std::fs::write(
|
|
144
|
+
&role_file,
|
|
145
|
+
role_doc_for_provider("worker_b", "Added Worker", "claude"),
|
|
146
|
+
)
|
|
147
|
+
.unwrap();
|
|
138
148
|
let add_transport = RecordingTransport::new().with_session_present(true);
|
|
139
149
|
add_agent_with_transport(
|
|
140
150
|
&add_team,
|
|
@@ -146,25 +156,10 @@ fn worker_spawn_scrubs_cross_provider_process_identity_but_keeps_config_env() {
|
|
|
146
156
|
)
|
|
147
157
|
.expect("add-agent fixture should spawn worker");
|
|
148
158
|
|
|
149
|
-
let fork_team = compiled_team_dir("cross-fork", &[("worker_a", "Fork Source")]);
|
|
150
|
-
seed_forkable_source_state(&fork_team, "worker_a");
|
|
151
|
-
let fork_transport = RecordingTransport::new().with_session_present(true);
|
|
152
|
-
fork_agent_with_transport(
|
|
153
|
-
&fork_team,
|
|
154
|
-
&AgentId::new("worker_a"),
|
|
155
|
-
&AgentId::new("worker_fork"),
|
|
156
|
-
None,
|
|
157
|
-
false,
|
|
158
|
-
None,
|
|
159
|
-
&fork_transport,
|
|
160
|
-
)
|
|
161
|
-
.expect("fork-agent fixture should spawn worker");
|
|
162
|
-
|
|
163
159
|
let failures = [
|
|
164
160
|
("quick-start launch", launch_transport.single_spawn()),
|
|
165
161
|
("restart", restart_transport.single_spawn()),
|
|
166
162
|
("add-agent", add_transport.single_spawn()),
|
|
167
|
-
("fork-agent", fork_transport.single_spawn()),
|
|
168
163
|
]
|
|
169
164
|
.into_iter()
|
|
170
165
|
.flat_map(|(surface, spawn)| cross_provider_identity_failures(surface, &spawn))
|
|
@@ -177,6 +172,36 @@ fn worker_spawn_scrubs_cross_provider_process_identity_but_keeps_config_env() {
|
|
|
177
172
|
);
|
|
178
173
|
}
|
|
179
174
|
|
|
175
|
+
#[test]
|
|
176
|
+
#[serial(env)]
|
|
177
|
+
fn worker_spawn_codex_in_window_fork_reports_unverified_not_unsupported() {
|
|
178
|
+
// 已废除的行为:旧实现把 codex in-window fork 当成已验证能力(或报「不支持」),此断言证明它确实没了。
|
|
179
|
+
// 本轮裁定:codex 走这条路必须明确报「未验证」,不是「不支持」。
|
|
180
|
+
let _home = hermetic_guard::HermeticTestEnv::enter("codex-fork-unverified");
|
|
181
|
+
let team = compiled_team_dir("codex-fork-tombstone", &[("worker_a", "Fork Source")]);
|
|
182
|
+
seed_forkable_source_state(&team, "worker_a");
|
|
183
|
+
let transport = RecordingTransport::new().with_session_present(true);
|
|
184
|
+
let err = fork_agent_with_transport(
|
|
185
|
+
&team,
|
|
186
|
+
&AgentId::new("worker_a"),
|
|
187
|
+
&AgentId::new("worker_a"),
|
|
188
|
+
None,
|
|
189
|
+
false,
|
|
190
|
+
None,
|
|
191
|
+
&transport,
|
|
192
|
+
)
|
|
193
|
+
.expect_err("codex in-window fork must refuse as unverified");
|
|
194
|
+
let text = err.to_string();
|
|
195
|
+
assert!(
|
|
196
|
+
text.contains("未验证") && text.contains("unverified"),
|
|
197
|
+
"codex in-window fork must report 未验证; err={text}"
|
|
198
|
+
);
|
|
199
|
+
assert!(
|
|
200
|
+
!text.contains("不支持") && !text.contains("does not support"),
|
|
201
|
+
"the ruling is unverified, not unsupported; err={text}"
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
180
205
|
#[test]
|
|
181
206
|
#[serial(env)]
|
|
182
207
|
fn worker_spawn_stays_out_of_coordinator_tick_and_daemon_preserves_parent_env() {
|
|
@@ -304,17 +329,23 @@ fn cross_provider_identity_failures(surface: &str, spawn: &RecordedSpawn) -> Vec
|
|
|
304
329
|
}
|
|
305
330
|
|
|
306
331
|
fn compiled_team_dir(label: &str, agents: &[(&str, &str)]) -> PathBuf {
|
|
332
|
+
compiled_team_dir_for_provider(label, agents, "codex")
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
fn compiled_team_dir_for_provider(label: &str, agents: &[(&str, &str)], provider: &str) -> PathBuf {
|
|
307
336
|
let team = tmp_dir(label).join("teamdir");
|
|
308
337
|
std::fs::create_dir_all(team.join("agents")).unwrap();
|
|
309
338
|
std::fs::write(
|
|
310
339
|
team.join("TEAM.md"),
|
|
311
|
-
|
|
340
|
+
format!(
|
|
341
|
+
"---\nname: envteam\nobjective: Worker spawn env contract.\nprovider: {provider}\n---\n\nTeam.\n"
|
|
342
|
+
),
|
|
312
343
|
)
|
|
313
344
|
.unwrap();
|
|
314
345
|
for (name, role) in agents {
|
|
315
346
|
std::fs::write(
|
|
316
347
|
team.join("agents").join(format!("{name}.md")),
|
|
317
|
-
|
|
348
|
+
role_doc_for_provider(name, role, provider),
|
|
318
349
|
)
|
|
319
350
|
.unwrap();
|
|
320
351
|
}
|
|
@@ -328,12 +359,20 @@ fn compiled_team_dir(label: &str, agents: &[(&str, &str)]) -> PathBuf {
|
|
|
328
359
|
}
|
|
329
360
|
|
|
330
361
|
fn role_doc(name: &str, role: &str) -> String {
|
|
362
|
+
role_doc_for_provider(name, role, "codex")
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
fn role_doc_for_provider(name: &str, role: &str, provider: &str) -> String {
|
|
331
366
|
format!(
|
|
332
|
-
"---\nname: {name}\nrole: {role}\nprovider:
|
|
367
|
+
"---\nname: {name}\nrole: {role}\nprovider: {provider}\nmodel: {provider}-test-model\nauth_mode: subscription\ndangerously_skip_permissions: false\ntools:\n - mcp_team\n---\n\n{role}.\n"
|
|
333
368
|
)
|
|
334
369
|
}
|
|
335
370
|
|
|
336
371
|
fn seed_restart_state(team: &Path, agent_id: &str) {
|
|
372
|
+
seed_restart_state_as(team, agent_id, "codex");
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
fn seed_restart_state_as(team: &Path, agent_id: &str, provider: &str) {
|
|
337
376
|
team_agent::state::persist::save_runtime_state(
|
|
338
377
|
team,
|
|
339
378
|
&json!({
|
|
@@ -344,7 +383,7 @@ fn seed_restart_state(team: &Path, agent_id: &str) {
|
|
|
344
383
|
"agents": {
|
|
345
384
|
agent_id: {
|
|
346
385
|
"status": "running",
|
|
347
|
-
"provider":
|
|
386
|
+
"provider": provider,
|
|
348
387
|
"role": "Restart Worker",
|
|
349
388
|
"tools": ["mcp_team"],
|
|
350
389
|
"window": agent_id,
|
|
@@ -360,6 +399,10 @@ fn seed_restart_state(team: &Path, agent_id: &str) {
|
|
|
360
399
|
}
|
|
361
400
|
|
|
362
401
|
fn seed_running_add_agent_state(team: &Path, agent_id: &str) {
|
|
402
|
+
seed_running_add_agent_state_as(team, agent_id, "codex");
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
fn seed_running_add_agent_state_as(team: &Path, agent_id: &str, provider: &str) {
|
|
363
406
|
let workspace = team_agent::model::paths::team_workspace(team).unwrap();
|
|
364
407
|
team_agent::state::persist::save_runtime_state(
|
|
365
408
|
&workspace,
|
|
@@ -371,7 +414,7 @@ fn seed_running_add_agent_state(team: &Path, agent_id: &str) {
|
|
|
371
414
|
"agents": {
|
|
372
415
|
agent_id: {
|
|
373
416
|
"status": "running",
|
|
374
|
-
"provider":
|
|
417
|
+
"provider": provider,
|
|
375
418
|
"role": "Existing Worker",
|
|
376
419
|
"tools": ["mcp_team"],
|
|
377
420
|
"window": agent_id,
|
|
@@ -45,31 +45,44 @@ pub(crate) fn test_binary_path() -> &'static str {
|
|
|
45
45
|
.as_str()
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
mod acceptance_b_batch_red;
|
|
48
49
|
mod agent_ops;
|
|
49
|
-
mod core;
|
|
50
|
-
mod lane_ops;
|
|
51
|
-
mod launch_spawn;
|
|
52
|
-
mod lifecycle_lock;
|
|
53
|
-
mod main_preserved;
|
|
54
|
-
mod phase_b_contracts;
|
|
55
|
-
mod phase_golden;
|
|
56
|
-
mod restart;
|
|
57
50
|
mod b0_legacy_snapshot_nonauthority_contract;
|
|
58
51
|
mod b0_reader_hideone_audit_contract;
|
|
59
52
|
mod behavioral_diff_264_red;
|
|
53
|
+
mod claude_compatible_config_red;
|
|
60
54
|
mod claude_profile_launch_red;
|
|
61
|
-
mod
|
|
55
|
+
mod clone_agent_preserves_source_tools;
|
|
56
|
+
mod clone_fork_copilot_perms_red;
|
|
62
57
|
mod codex_weak_window_attribution_red;
|
|
58
|
+
mod communication_mode_runtime_contract_red;
|
|
63
59
|
mod copilot_provider_red;
|
|
64
|
-
mod
|
|
60
|
+
mod core;
|
|
65
61
|
mod core_034_real_red;
|
|
62
|
+
mod cursor_mcp_overlay;
|
|
63
|
+
mod cursor_require_explicit_model_red;
|
|
64
|
+
mod cursor_restart_resume_red;
|
|
65
|
+
mod display_adaptive_red;
|
|
66
66
|
mod f032_startup_prompt_best_effort_red;
|
|
67
|
+
mod g1_silent_faces;
|
|
68
|
+
mod grok_effort_argv_red;
|
|
69
|
+
mod grok_mcp_overlay_red;
|
|
70
|
+
mod grok_require_explicit_model_red;
|
|
71
|
+
mod grok_restart_resume_red;
|
|
67
72
|
mod harvest2_a_batch_red;
|
|
68
73
|
mod host_cotenant_death_p0_contract;
|
|
74
|
+
mod lane_ops;
|
|
75
|
+
mod launch_spawn;
|
|
76
|
+
mod lifecycle_lock;
|
|
69
77
|
mod lifecycle_rollback_red;
|
|
78
|
+
mod main_preserved;
|
|
79
|
+
mod mcp_tool_name_format_red;
|
|
80
|
+
mod phase_b_contracts;
|
|
81
|
+
mod phase_golden;
|
|
70
82
|
mod quick_start_worker_readiness_red;
|
|
71
83
|
mod realmachine_clusters_1_6_red;
|
|
72
84
|
mod realmachine_residual_g1_g4_red;
|
|
85
|
+
mod restart;
|
|
73
86
|
mod restart_build_before_destroy_0540_contract;
|
|
74
87
|
mod restart_liveness_red;
|
|
75
88
|
mod restart_rebind_hotfix_252_red;
|
|
@@ -88,9 +101,4 @@ mod team_key_retirement_txn_red;
|
|
|
88
101
|
mod test_isolation_escape_contract;
|
|
89
102
|
mod upgrade_compat_0211_red;
|
|
90
103
|
mod verify_rs031_window_consistency_red;
|
|
91
|
-
mod worker_dangerous_bypass_argv_red;
|
|
92
104
|
mod worker_spawn_env_red;
|
|
93
|
-
mod acceptance_b_batch_red;
|
|
94
|
-
mod claude_compatible_config_red;
|
|
95
|
-
mod communication_mode_runtime_contract_red;
|
|
96
|
-
mod clone_fork_copilot_perms_red;
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
//! ---
|
|
2
|
+
//! purpose: lifecycle 的数据类型集中定义,newtype、枚举、报告结构、错误与事件名常量
|
|
3
|
+
//! contract:
|
|
4
|
+
//! provides:
|
|
5
|
+
//! - name: PlanId
|
|
6
|
+
//! what: 受正则约束的 plan 标识,构造时拒斜杠空格与路径穿越
|
|
7
|
+
//! - name: PlanCondition
|
|
8
|
+
//! what: plan 推进条件的封闭文法,只认 any 与 report_result 字段相等
|
|
9
|
+
//! - name: LifecycleError
|
|
10
|
+
//! what: 本模块所有对外错误的统一枚举
|
|
11
|
+
//! - name: CoordinatorStartSummary
|
|
12
|
+
//! what: coordinator 启动结果在 lifecycle 报告里的投影
|
|
13
|
+
//! - name: event_names
|
|
14
|
+
//! what: lifecycle/restart/display 稳定事件名常量集
|
|
15
|
+
//! depends:
|
|
16
|
+
//! - crate::model::ids
|
|
17
|
+
//! - crate::provider
|
|
18
|
+
//! - crate::transport
|
|
19
|
+
//! - crate::coordinator
|
|
20
|
+
//! boundary:
|
|
21
|
+
//! - 只定义类型与解析,不做 IO、不 spawn、不落盘
|
|
22
|
+
//! - 事件名只声明常量,实际写事件由各行为文件负责
|
|
23
|
+
//! maturity: wired
|
|
24
|
+
//! ---
|
|
1
25
|
//! lifecycle 数据类型:newtype / enum / data struct / error / outcome-report 集中定义。
|
|
2
26
|
|
|
3
27
|
use std::collections::BTreeMap;
|
|
@@ -40,6 +64,9 @@ pub mod event_names {
|
|
|
40
64
|
pub const DISPLAY_ADAPTIVE_BLOCKED: &str = "display.adaptive_blocked";
|
|
41
65
|
pub const DISPLAY_ADAPTIVE_REBUILT: &str = "display.adaptive_rebuilt";
|
|
42
66
|
pub const DISPLAY_ADAPTIVE_CLOSED: &str = "display.adaptive_closed";
|
|
67
|
+
/// Directory-scoped grok toml dropped leftover per-seat `TEAM_AGENT_*` keys.
|
|
68
|
+
/// Fields: `path` (file), `keys` (names only — never values).
|
|
69
|
+
pub const GROK_TOML_PER_SEAT_KEYS_CLEARED: &str = "lifecycle.grok_toml.per_seat_keys_cleared";
|
|
43
70
|
}
|
|
44
71
|
|
|
45
72
|
// ===========================================================================
|
|
@@ -54,6 +81,14 @@ pub mod event_names {
|
|
|
54
81
|
pub struct PlanId(String);
|
|
55
82
|
|
|
56
83
|
impl PlanId {
|
|
84
|
+
/// ---
|
|
85
|
+
/// purpose: 校验并构造 PlanId
|
|
86
|
+
/// params:
|
|
87
|
+
/// raw: 原始 plan 名,首字符须字母数字,其余只许字母数字与下划线点横线,长度不超过 64
|
|
88
|
+
/// returns: 通过校验的 PlanId
|
|
89
|
+
/// errors: 不满足上述形状时返回 InvalidPlanId
|
|
90
|
+
/// contract_id: lifecycle.types.plan_id_parse
|
|
91
|
+
/// ---
|
|
57
92
|
/// `sanitize_plan_id`(`orchestrator/state.py:18`):正则校验,失败 → `Err`。
|
|
58
93
|
pub fn parse(raw: &str) -> Result<Self, LifecycleError> {
|
|
59
94
|
let mut chars = raw.chars();
|
|
@@ -70,6 +105,10 @@ impl PlanId {
|
|
|
70
105
|
)))
|
|
71
106
|
}
|
|
72
107
|
}
|
|
108
|
+
/// ---
|
|
109
|
+
/// purpose: 取 PlanId 的原始字符串
|
|
110
|
+
/// returns: 构造时保存的原文
|
|
111
|
+
/// ---
|
|
73
112
|
pub fn as_str(&self) -> &str {
|
|
74
113
|
&self.0
|
|
75
114
|
}
|
|
@@ -92,6 +131,12 @@ pub struct CoordinatorStartSummary {
|
|
|
92
131
|
}
|
|
93
132
|
|
|
94
133
|
impl CoordinatorStartSummary {
|
|
134
|
+
/// ---
|
|
135
|
+
/// purpose: 把 coordinator 的 StartReport 投影成 lifecycle 报告用的摘要
|
|
136
|
+
/// params:
|
|
137
|
+
/// report: coordinator 启动返回的原始报告
|
|
138
|
+
/// returns: 摘要,status 已转成稳定 wire 字符串,binary_identity_relation 原样带出
|
|
139
|
+
/// ---
|
|
95
140
|
pub fn from_start_report(report: &crate::coordinator::StartReport) -> Self {
|
|
96
141
|
Self {
|
|
97
142
|
ok: report.ok,
|
|
@@ -117,6 +162,10 @@ fn coordinator_start_status_wire(status: crate::coordinator::StartOutcome) -> &'
|
|
|
117
162
|
}
|
|
118
163
|
}
|
|
119
164
|
|
|
165
|
+
/// ---
|
|
166
|
+
/// purpose: 把 coordinator 启动摘要序列化成 JSON 对象
|
|
167
|
+
/// returns: 含 ok、status、pid、binary 路径与版本、rotation_reason、binary_identity_relation 的 JSON
|
|
168
|
+
/// ---
|
|
120
169
|
pub fn coordinator_start_summary_value(summary: &CoordinatorStartSummary) -> serde_json::Value {
|
|
121
170
|
serde_json::json!({
|
|
122
171
|
"ok": summary.ok,
|
|
@@ -142,6 +191,10 @@ impl std::fmt::Display for PlanId {
|
|
|
142
191
|
pub struct DisplaySessionName(pub String);
|
|
143
192
|
|
|
144
193
|
impl DisplaySessionName {
|
|
194
|
+
/// ---
|
|
195
|
+
/// purpose: 取 ghostty 派生 display session 名的原始字符串
|
|
196
|
+
/// returns: 内部保存的名字
|
|
197
|
+
/// ---
|
|
145
198
|
pub fn as_str(&self) -> &str {
|
|
146
199
|
&self.0
|
|
147
200
|
}
|
|
@@ -353,6 +406,14 @@ pub enum PlanCondition {
|
|
|
353
406
|
}
|
|
354
407
|
|
|
355
408
|
impl PlanCondition {
|
|
409
|
+
/// ---
|
|
410
|
+
/// purpose: 解析 plan 推进条件的封闭文法
|
|
411
|
+
/// params:
|
|
412
|
+
/// expr: any,或 report_result.<字段> == <值>,值须带单引号或双引号
|
|
413
|
+
/// returns: Any 或 FieldEq
|
|
414
|
+
/// errors: 前缀不对、缺等号、字段名非法或值未带引号时返回 InvalidPlan
|
|
415
|
+
/// contract_id: lifecycle.types.plan_condition_parse
|
|
416
|
+
/// ---
|
|
356
417
|
/// 解析封闭条件文法。越界 raise `InvalidPlan`(`orchestrator/plan.py:_is_supported_condition`)。
|
|
357
418
|
pub fn parse(expr: &str) -> Result<Self, LifecycleError> {
|
|
358
419
|
let trimmed = expr.trim();
|
|
@@ -473,8 +534,6 @@ pub struct LaunchReport {
|
|
|
473
534
|
pub routes: Vec<RoutingDecision>,
|
|
474
535
|
/// 权限摘要(每 agent 一条)。
|
|
475
536
|
pub permissions: Vec<PermissionSummary>,
|
|
476
|
-
/// 危险审批安全态(dry-run 报告里的 `safety`)。
|
|
477
|
-
pub safety: DangerousApproval,
|
|
478
537
|
/// leader receiver(attach 成功时;经 step10 leader::attach_leader_to_state)。
|
|
479
538
|
pub leader_receiver_attached: bool,
|
|
480
539
|
pub session_capture_incomplete_agents: Vec<String>,
|