Skip to content

Add multi-car support and owner approval for family requests - #24

Merged
itbird merged 1 commit into
mainfrom
cursor/multi-vehicle-family-6dee
Nov 14, 2026
Merged

itbird merged 1 commit into
mainfrom
cursor/multi-vehicle-family-6dee

Conversation

@itbird

@itbird itbird commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

Summary

An account with one car behaves as before. An account with several cars can name each one, pick one per command, and keep history, alerts, and briefings separate. A family member can ask for a sensitive action, and the owner approves or denies it. AgentDrive does not send that message itself.

Several cars

  • agentdrive cars lists cars from the vehicle list. It does not wake a car and it never prints a full VIN. A masked tail is shown.
  • agentdrive cars name <tail> <nickname> stores a nickname in the private config home. agentdrive cars default <nickname> sets the default. cars clear-default clears it.
  • --car <nickname> selects a car. It may appear before or after the command. With one car, --car is unnecessary and existing commands stay the same.
  • With several cars and no default, a command does not guess. It asks for --car or a default.
  • The first car that is named keeps history and alert memory already saved in the config home. Each later car gets its own history database and alert file. The same alert on two cars is remembered separately.
  • With several cars, the health check is agentdrive check --json --car <nickname> once per car, and the morning job is agentdrive history due --car <nickname> once per car. check, report, where, and history still do not wake the car.

Confirmation wording

With one car and no --car, the sentence is unchanged, for example I confirm unlock.

When a nickname is in use, the prompt, the sentence, and the result name that car:

  • Prompt: Confirm unlock on daily. Type a sentence that names the action and the car and includes confirm:
  • Sentence: I confirm unlock on daily
  • Result: OK: unlock on daily

I confirm unlock is not accepted for that car, and a sentence that names a different nickname does not run. A schedule still cannot supply the confirmation.

Family requests

  • agentdrive family add <handle> and agentdrive family allow <handle> <action> record who may ask for what. charging covers the charging changes.
  • Low-risk actions the owner allowed run directly with --as <handle>.
  • Unlock, charging changes, sentry off, the trunk, the front trunk, remote start, and departure changes are not run for a family member. The command saves a pending request (who, car, action, parameters, created time, 10-minute expiry) and prints relay text for the assistant to give the owner.
  • The owner uses agentdrive request list, agentdrive request approve <id>, and agentdrive request deny <id>. Approve runs the action once, and the car must still be in Park at speed 0. A second approve, a deny, an expired request, or an approve from the same family member does not run it.

Example relay text:

Pending request ab12cd34 from rider on daily: unlock.
Created 2026-11-14T01:00:00Z. Expires 2026-11-14T01:10:00Z (10 minutes).
This action was not run.
Tell the owner: rider asked to unlock on daily. Approve with `agentdrive request approve ab12cd34` or deny with `agentdrive request deny ab12cd34`.

Tests

tests/test_cars_and_family.py covers selection, refusal without a default, per-car history and alert dedupe, migration of the existing single-car history, and the request lifecycle: create, list, approve once, deny, expiry, and blocked self-approval. Full pytest passes.

Open in Web Open in Cursor 

Several cars can be named and selected with --car or a default. History,
alerts, and briefings stay with each car. A family member's sensitive
action becomes a pending request the owner approves once.
@itbird
itbird merged commit b1d71fc into main Nov 14, 2026
2 checks passed
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