Skip to content

feat: OOB secure input improvements + credential_store toolset#128

Merged
kumaakh merged 33 commits intomainfrom
feat/oob-improvements
Apr 20, 2026
Merged

feat: OOB secure input improvements + credential_store toolset#128
kumaakh merged 33 commits intomainfrom
feat/oob-improvements

Conversation

@kumaakh
Copy link
Copy Markdown
Contributor

@kumaakh kumaakh commented Apr 14, 2026

Summary

  • Phase 1: Replace manual raw-mode password input in auth.ts with secureInput() utility
  • Phase 2: New credential_store MCP toolset (set/list/delete)
  • Phase 3: {{secure.NAME}} token resolution in execute_command, register_member, update_member, provision_vcs_auth, provision_auth
  • Security hardening: random persistent encryption key, migration path

New tools

Tool Description
credential_store_set Collect secret OOB, store encrypted (session or persistent)
credential_store_list List stored credentials by name/scope — no values returned
credential_store_delete Delete a named credential

{{secure.NAME}} token resolution

Tool Field(s)
execute_command command, restart_command
register_member password
update_member password
provision_vcs_auth token (GitHub), api_token (Bitbucket), pat (Azure DevOps)
provision_auth api_key

Tokens resolved server-side — LLM never sees plaintext. Output redacted ([REDACTED:NAME]) including monitor_task output. Network egress policy (allow/confirm/deny) with OOB TTY confirmation.

Review

Reviewed by fleet-rev — APPROVED. All 9 findings addressed (2 HIGH, 4 MED, 3 LOW).

🤖 Generated with Claude Code

Bot and others added 8 commits April 18, 2026 21:35
…E}} resolution in execute_command

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
password import was being mistakenly used as a variable — replaced all
references with inputValue. Removed unused @inquirer/password import.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@kumaakh kumaakh force-pushed the feat/oob-improvements branch from 8765a04 to 6dda598 Compare April 19, 2026 01:39
Bot and others added 21 commits April 19, 2026 14:18
getOrCreateKey() was writing raw binary to FLEET_DIR/key, but the test
(and original design) expects a hex-encoded 32-byte key at FLEET_DIR/salt.
Changed to read/write hex at SALT_PATH so the persistent key file is
human-readable and matches the expected path.
…rompt

The OOB credential collection terminal showed "Enter API key" and "API key:"
labels, which are misleading when collecting arbitrary secrets via
credential_store_set. Renamed both to "Secure Value".
Extends the same token resolution logic from execute-command to
register_member so that credentials stored via credential_store_set
can be referenced as {{secure.NAME}} in the password parameter.
H1: apply resolveSecureTokens() to restart_command in execute-command.ts
H2: apply redactOutput() to long-running task launch output
M1: credentialDelete now removes from both session and persistent tiers unconditionally
M2: OOB confirmation prompt uses plain visible readline input instead of masked secureInput
M3: pass input.prompt through collectOobApiKey() → auth.ts --prompt arg → secureInput
M4: add 16 tests covering credential round-trip, token resolution, output redaction, network egress policies
L1: remove unused KEY_PATH, SALT_LENGTH, getOrCreateSalt from crypto.ts
L2: change "API key received" to "Secure value received" in auth.ts
L3: add "Best-effort heuristic — not a security boundary" comment on NETWORK_TOOL_RE
Add early guard in execute_prompt that returns an error if the prompt
contains {{secure.NAME}} tokens — secrets must never reach LLM context.
Fix docs in SKILL.md, tpl-doer.md, onboarding.md, and README.md to
clarify that {{secure.NAME}} resolution only happens in execute_command
and specific MCP tool params, never in execute_prompt prompts.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant