Originally created by: kumaakh
All tools now accept member_name as an alternative to member_id. A resolveMember utility handles lookup by UUID (precedence) or friendly name. Validation rejects calls with neither.
receive_files toolDownload files from a member to a local directory. Mirrors send_files — accepts multiple paths in a single call, enforces work_folder boundary.
MCP server registered as apra fleet server <version>. All JSON-format tool outputs include a server_version field.
ProviderAdapter interface extended with three methods: oauthCredentialFiles(), oauthSettingsMerge(), oauthEnvVarsToUnset(). provision_auth and remove_member are now fully provider-generic.
oauth_creds.json, google_accounts.json, settings.json), deep-merges security.auth.selectedType = oauth-personal, unsets GEMINI_API_KEYNew OS helpers: readRemoteJson, deepMergeJson (recursive JSON merge via remote node script), shellPath (preserves $HOME variable expansion when escaping remote paths).
list_members and member_detail show auth mode per member: oauth, api-key, or none.
Prompts written to a unique .fleet-task-<uuid>.md file in the member work folder and passed by reference. Eliminates shell quoting bugs on Windows with Gemini CLI.
Premium model tier maps to gemini-3-pro-preview. key_path consolidates cloud_ssh_key_path.
execute_prompt model parameter advertises cheap / standard / premium as primary input. Tier-to-model resolution is per-provider via modelTiers().
All tool descriptions rewritten from user perspective — no internal field names, env var names, file paths, or implementation details exposed.
remove_member: skips SSH key deletion when key is shared with another membersend_files / receive_files: null-byte rejection in file path inputs$HOME now expands correctly in all remote shell commandsdeepMergeJson: fixed shell quoting conflict in inline node scriptreset_session removed — redundant with execute_prompt(resume=false)| Issue | Observation |
|---|---|
| [#51] | member_detail(member_name="focus-dev2") → correct member. No params → validation error. Unknown name → "not found". |
| [#50] | fleet_status(format="json") → "version":"v0.1.3_d10302". member_detail(format="json") → "server_version":"v0.1.3_d10302". |
| [#62] | provision_auth(member_name="focus-dev2") → "✅ OAuth credentials for gemini deployed. Auth: verified with a successful gemini API call." |
| [#53] | execute_prompt(model="cheap") on Claude member → succeeded. |
🤖 Generated with Claude Code
Tickets: #221
Tickets: #50
Tickets: #51
Tickets: #53
Tickets: #62
Tickets: #66
Ticket changed by: kumaakh