@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
|
@@ -1054,7 +1054,7 @@ fn team_dir(root: &Path, name: &str, agents: &[(&str, &str)]) -> PathBuf {
|
|
|
1054
1054
|
|
|
1055
1055
|
fn role_doc(name: &str, role: &str) -> String {
|
|
1056
1056
|
format!(
|
|
1057
|
-
"---\nname: {name}\nrole: {role}\nprovider: codex\nmodel: gpt-5.5\nauth_mode: subscription\ntools:\n - mcp_team\n---\n\n{role}.\n"
|
|
1057
|
+
"---\nname: {name}\nrole: {role}\nprovider: codex\nmodel: gpt-5.5\nauth_mode: subscription\ndangerously_skip_permissions: false\ntools:\n - mcp_team\n---\n\n{role}.\n"
|
|
1058
1058
|
)
|
|
1059
1059
|
}
|
|
1060
1060
|
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
//! ---
|
|
2
|
+
//! purpose: team 显示面的能力探测、后端解析、开关与 rebind 后重建
|
|
3
|
+
//! contract:
|
|
4
|
+
//! provides:
|
|
5
|
+
//! - name: resolve_display_backend
|
|
6
|
+
//! what: 按 requested 优先于 recorded 优先于 adaptive 选后端,并标出是否偏离默认
|
|
7
|
+
//! - name: probe_display_capabilities
|
|
8
|
+
//! what: 探测当前进程能否开 adaptive 显示,给出被挡原因
|
|
9
|
+
//! - name: open_worker_displays
|
|
10
|
+
//! what: 按后端为各 worker 打开显示,返回 agent 到 WorkerDisplay 的映射
|
|
11
|
+
//! - name: close_team_display_backends
|
|
12
|
+
//! what: 关闭本 team 的显示后端
|
|
13
|
+
//! - name: rebuild_adaptive_display_after_rebind
|
|
14
|
+
//! what: leader rebind 之后重建 adaptive 窗口
|
|
15
|
+
//! depends:
|
|
16
|
+
//! - crate::transport
|
|
17
|
+
//! - crate::state::persist
|
|
18
|
+
//! boundary:
|
|
19
|
+
//! - 不 spawn 也不 kill worker 进程,只管显示面
|
|
20
|
+
//! - 显示失败不阻塞 team readiness
|
|
21
|
+
//! - tmux 操作一律走 workspace 作用域的 TmuxBackend,不用继承 $TMUX 的 ambient 调用
|
|
22
|
+
//! - ambient leader-pane 探测不属于本文件
|
|
23
|
+
//! maturity: wired
|
|
24
|
+
//! ---
|
|
1
25
|
//!
|
|
2
26
|
//! lifecycle::display —— 能力门 / 后端解析 / 开关 / rebind 后重建。
|
|
3
27
|
//!
|
|
@@ -20,6 +44,13 @@ use super::*;
|
|
|
20
44
|
|
|
21
45
|
// ── lifecycle::display —— 能力门 / 后端解析 / 开关 / rebind 后重建 ────────────
|
|
22
46
|
|
|
47
|
+
/// ---
|
|
48
|
+
/// purpose: 定出本次使用的显示后端
|
|
49
|
+
/// params:
|
|
50
|
+
/// requested: 本次命令显式请求的后端,None 表示未指定
|
|
51
|
+
/// recorded: state 里记录的上次后端
|
|
52
|
+
/// returns: 选中的后端,附带它是否偏离默认 adaptive
|
|
53
|
+
/// ---
|
|
23
54
|
///
|
|
24
55
|
/// `resolve_display_backend(requested, recorded, source)`(`display/backend.py`)。默认
|
|
25
56
|
/// adaptive;显式 none 是逃生口。
|
|
@@ -34,6 +65,13 @@ pub fn resolve_display_backend(
|
|
|
34
65
|
}
|
|
35
66
|
}
|
|
36
67
|
|
|
68
|
+
/// ---
|
|
69
|
+
/// purpose: 探测当前环境是否具备 adaptive 显示能力
|
|
70
|
+
/// params:
|
|
71
|
+
/// _workspace: 未参与判定,仅保留签名
|
|
72
|
+
/// returns: 平台名、leader 所在 tmux session 与 pane、能力位、状态与被挡原因
|
|
73
|
+
/// errors: 当前实现不产生 Err
|
|
74
|
+
/// ---
|
|
37
75
|
///
|
|
38
76
|
/// `probe_display_capabilities(...)`(`display/adaptive.py:31`,C13)。能力探测,分支只看
|
|
39
77
|
/// 结果不看 `cfg!(target_os)`;Windows/WSL → `NotImplementedThisPlatform`。
|
|
@@ -71,6 +109,14 @@ pub fn probe_display_capabilities(_workspace: &Path) -> Result<DisplayProbe, Lif
|
|
|
71
109
|
})
|
|
72
110
|
}
|
|
73
111
|
|
|
112
|
+
/// ---
|
|
113
|
+
/// purpose: 按已解析的后端为各 worker 打开显示
|
|
114
|
+
/// params:
|
|
115
|
+
/// backend: 已解析的显示后端;不带 worker 视图的后端得到空映射
|
|
116
|
+
/// probe: 能力探测结果,adaptive 分支据此决定开还是记 blocked
|
|
117
|
+
/// returns: 后端与 agent_id 到 WorkerDisplay 的映射
|
|
118
|
+
/// errors: adaptive 开窗或读取显示目标失败时返回 LifecycleError
|
|
119
|
+
/// ---
|
|
74
120
|
///
|
|
75
121
|
/// `open_worker_displays(workspace, session_name, jobs, backend, capability_probe)`
|
|
76
122
|
/// (`display/worker_window.py`)。按后端分派 adaptive / ghostty_workspace / ghostty_window;
|
|
@@ -95,6 +141,11 @@ pub(crate) fn open_worker_displays(
|
|
|
95
141
|
Ok(OpenDisplaysReport { backend, displays })
|
|
96
142
|
}
|
|
97
143
|
|
|
144
|
+
/// ---
|
|
145
|
+
/// purpose: 关闭本 team 的显示,当前实现只处理 adaptive
|
|
146
|
+
/// returns: 关闭报告
|
|
147
|
+
/// errors: 底层 tmux 操作失败时返回 LifecycleError
|
|
148
|
+
/// ---
|
|
98
149
|
///
|
|
99
150
|
/// `close_team_display_backends(state, event_log)`(`display/close.py`,C9)。按 state
|
|
100
151
|
/// 记录的后端关显示;adaptive 只删带 team tag 的窗口(C2 leader pane 安全)+ orphan 清理。
|
|
@@ -105,6 +156,11 @@ pub fn close_team_display_backends(
|
|
|
105
156
|
close_adaptive_displays(workspace, session_name)
|
|
106
157
|
}
|
|
107
158
|
|
|
159
|
+
/// ---
|
|
160
|
+
/// purpose: leader rebind 完成之后重建 adaptive worker 窗口
|
|
161
|
+
/// returns: 重新打开的显示映射
|
|
162
|
+
/// errors: 同 open_worker_displays
|
|
163
|
+
/// ---
|
|
108
164
|
///
|
|
109
165
|
/// `rebuild_adaptive_display_after_rebind(...)`(`display/rebuild.py`,C12)。restart 在
|
|
110
166
|
/// leader rebind **之后**重建 adaptive 窗口(读 `leader_receiver.rebind_applied` 事件)。
|
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
//! ---
|
|
2
|
+
//! purpose: runtime 快照的诊断性落盘,以及 plan 状态文件的路径与读写
|
|
3
|
+
//! contract:
|
|
4
|
+
//! provides:
|
|
5
|
+
//! - name: save_team_runtime_snapshot
|
|
6
|
+
//! what: 把 runtime state 以带 not_authoritative 标记的诊断副本写到 legacy 每 session 路径
|
|
7
|
+
//! - name: team_snapshot_path
|
|
8
|
+
//! what: 给出某 session 的诊断快照路径
|
|
9
|
+
//! - name: plan_state_path
|
|
10
|
+
//! what: 给出某 plan 的状态文件路径
|
|
11
|
+
//! - name: plan_lock_path
|
|
12
|
+
//! what: 给出某 plan 的锁文件路径
|
|
13
|
+
//! - name: read_plan_state
|
|
14
|
+
//! what: 读取并反序列化 plan 状态
|
|
15
|
+
//! - name: save_plan_state
|
|
16
|
+
//! what: 序列化 plan 状态并经临时文件 rename 落盘
|
|
17
|
+
//! depends:
|
|
18
|
+
//! - crate::state::persist
|
|
19
|
+
//! - crate::model::paths
|
|
20
|
+
//! - std::fs
|
|
21
|
+
//! boundary:
|
|
22
|
+
//! - 快照文件不是权威 runtime state,产品写路径不得调用它
|
|
23
|
+
//! - plan 锁文件只被创建,本模块不对它加锁,也不提供并发互斥
|
|
24
|
+
//! - 不解释 plan 语义,只做路径、序列化与落盘
|
|
25
|
+
//! maturity: wired
|
|
26
|
+
//! ---
|
|
1
27
|
//!
|
|
2
28
|
//! lifecycle::helpers —— runtime snapshot 原子写(bug-084)+ plan-state 路径/读取。
|
|
3
29
|
|
|
@@ -7,6 +33,13 @@ use std::path::{Path, PathBuf};
|
|
|
7
33
|
|
|
8
34
|
use super::*;
|
|
9
35
|
|
|
36
|
+
/// ---
|
|
37
|
+
/// purpose: 把 runtime state 写成带诊断标记的每 session 快照副本
|
|
38
|
+
/// params:
|
|
39
|
+
/// state: 待快照的 runtime state,必须含 session_name 字段
|
|
40
|
+
/// returns: 写出的快照文件路径
|
|
41
|
+
/// errors: 缺 session_name、建目录、写临时文件或 rename 失败时返回 StatePersist
|
|
42
|
+
/// ---
|
|
10
43
|
///
|
|
11
44
|
/// `save_team_runtime_snapshot(workspace, state)` — Foundation-0 F0-2:
|
|
12
45
|
/// this is now a **diagnostic-only** legacy per-session snapshot writer.
|
|
@@ -68,6 +101,12 @@ pub(crate) fn save_team_runtime_snapshot(
|
|
|
68
101
|
Ok(path)
|
|
69
102
|
}
|
|
70
103
|
|
|
104
|
+
/// ---
|
|
105
|
+
/// purpose: 给出某 session 的诊断快照文件路径
|
|
106
|
+
/// params:
|
|
107
|
+
/// session_name: 原始 session 名,非字母数字与下划线点横线的字符会被替换
|
|
108
|
+
/// returns: runtime 目录下 teams 子目录中的 state.json 路径
|
|
109
|
+
/// ---
|
|
71
110
|
pub fn team_snapshot_path(workspace: &Path, session_name: &str) -> PathBuf {
|
|
72
111
|
crate::model::paths::runtime_dir(workspace)
|
|
73
112
|
.join("teams")
|
|
@@ -98,10 +137,18 @@ fn safe_snapshot_name(raw: &str) -> String {
|
|
|
98
137
|
}
|
|
99
138
|
}
|
|
100
139
|
|
|
140
|
+
/// ---
|
|
141
|
+
/// purpose: 给出某 plan 的状态文件路径
|
|
142
|
+
/// returns: runtime 目录下 orchestrator 子目录中的 plan state 文件路径
|
|
143
|
+
/// ---
|
|
101
144
|
pub(crate) fn plan_state_path(workspace: &Path, plan_id: &PlanId) -> PathBuf {
|
|
102
145
|
plan_state_dir(workspace).join(format!("plan-{}.state.json", plan_id.as_str()))
|
|
103
146
|
}
|
|
104
147
|
|
|
148
|
+
/// ---
|
|
149
|
+
/// purpose: 给出某 plan 的锁文件路径
|
|
150
|
+
/// returns: runtime 目录下 orchestrator 子目录中的 plan lock 文件路径
|
|
151
|
+
/// ---
|
|
105
152
|
pub(crate) fn plan_lock_path(workspace: &Path, plan_id: &PlanId) -> PathBuf {
|
|
106
153
|
plan_state_dir(workspace).join(format!("plan-{}.lock", plan_id.as_str()))
|
|
107
154
|
}
|
|
@@ -110,6 +157,11 @@ fn plan_state_dir(workspace: &Path) -> PathBuf {
|
|
|
110
157
|
crate::model::paths::runtime_dir(workspace).join("orchestrator")
|
|
111
158
|
}
|
|
112
159
|
|
|
160
|
+
/// ---
|
|
161
|
+
/// purpose: 从文件读取并反序列化 plan 状态
|
|
162
|
+
/// returns: 解析出的 PlanState
|
|
163
|
+
/// errors: 文件读不到或 JSON 不合法时都返回 InvalidPlan
|
|
164
|
+
/// ---
|
|
113
165
|
pub(crate) fn read_plan_state(path: &Path) -> Result<PlanState, LifecycleError> {
|
|
114
166
|
let data = fs::read_to_string(path)
|
|
115
167
|
.map_err(|e| LifecycleError::InvalidPlan(format!("plan not found: {e}")))?;
|
|
@@ -117,6 +169,11 @@ pub(crate) fn read_plan_state(path: &Path) -> Result<PlanState, LifecycleError>
|
|
|
117
169
|
.map_err(|e| LifecycleError::InvalidPlan(format!("invalid plan state: {e}")))
|
|
118
170
|
}
|
|
119
171
|
|
|
172
|
+
/// ---
|
|
173
|
+
/// purpose: 序列化 plan 状态,经同目录临时文件 rename 落盘,并确保锁文件存在
|
|
174
|
+
/// returns: 写出的 plan 状态文件路径
|
|
175
|
+
/// errors: 建目录、创建锁文件、写临时文件或 rename 失败时返回 StatePersist
|
|
176
|
+
/// ---
|
|
120
177
|
pub(crate) fn save_plan_state(
|
|
121
178
|
workspace: &Path,
|
|
122
179
|
state: &PlanState,
|