The `atxp image` command was dropping any model/aspect-ratio the user wanted
to pin — `imageCommand(prompt)` only forwarded the prompt to
`image_create_image_async`. That left the server-side default in charge
which, for direct MCP callers (no atxp-pics wrapping), recently caused a
production incident where the default `gpt-4o-mini` path produced unfaithful
outputs until the env var was switched to `gpt-image-2`.
This adds:
- `--model <model>` — forwarded as the tool's `model` arg (gpt-image-2,
gpt-4o, dall-e-3, gemini-3-pro-image-preview, etc.)
- `--aspect-ratio <ratio>` (also accepts `--aspectRatio` for parity with the
underlying tool parameter name) — forwarded as `aspectRatio`
Empty/unset options are not added to the args object so server defaults
still kick in when nothing is specified.
Also bumps `@atxp/client` from `^0.10.5` to `^0.11.7` to match what
production MCP servers (image, music) are running. The 0.10.x series
predates the middleware-settlement work and several payment-protocol
fixes that landed in 0.11.x; the API surface used here (`atxpClient`,
`ATXPAccount`) is unchanged. `npm install` regenerated `package-lock.json`.
Help text + README usage examples updated.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds `atxp git` CLI command (create, list, remote-url, delete) backed by
the git.mcp.atxp.ai MCP server. Includes a separate atxp-git skill with
documentation emphasizing the ephemeral nature of authenticated remote URLs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The email service no longer auto-marks messages as read on retrieval.
This adds `npx atxp email mark-read <messageId>` to explicitly mark
messages as read using the new email_mark_as_read tool.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds `npx atxp phone mark-read <id> [id...]` to mark SMS messages as
read via the new phone_mark_read MCP tool.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes TypeScript build error from missing property in the help flag
early-return path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allow users to pass custom lyrics to the music generation tool via
--lyrics, forwarded to the music_create_async MCP endpoint.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Support startPublishedDate and endPublishedDate parameters on the
search_search MCP tool, allowing users to restrict results by
publication date. Also fixes toolArgs extraction to properly skip
flag values that would otherwise leak into the query string.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add --attach flag (repeatable) to email send and reply commands. The CLI
reads local files, detects MIME type from extension, and base64-encodes
content before passing to the MCP tool. Inbox and search results now
display attachment metadata (filename, type, size) inline.
https://claude.ai/code/session_013ZfRLDGZ9mawSATTJ8ToQg
Replace /hooks/wake + HEARTBEAT.md approach with direct /hooks/agent
channel targeting. Discovered channels are now sent to the notifications
service which stores them and uses them for delivery.
- Remove HEARTBEAT.md read/write/section-replace logic (~100 lines)
- Simplify configureHooksOnInstance to only set hooks.token
- Send discovered channels in the enable API request
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hoist sanitizeSessionValue to module scope (out of loop)
- Also strip quote/backtick chars to prevent LLM prompt injection
- Remove redundant sessionsPath alias, use SESSIONS_PATH directly
- Backtick-wrap channel/target values in HEARTBEAT.md output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Strip newlines/control chars and limit length on channel/to values
parsed from session keys to prevent prompt injection via HEARTBEAT.md
- Ensure newline separator between preceding content and replaced section
- Remove extra blank line after configureHooksOnInstance
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract hardcoded paths as named constants
- Replace regex section replacement with split-on-header approach
- Reset stale heartbeat target when channels disappear
- Add error handling for fetch, getAccountId, and configureHooksOnInstance
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of injecting instructions via /hooks/wake, directly write relay
instructions to HEARTBEAT.md and configure heartbeat delivery target from
discovered session channels. Adds sms.received to help text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Send { text, mode } instead of { message, name } to match the
/hooks/wake endpoint which injects into the main session.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use accountId directly instead of stripping email prefix, so
notifications match on atxp_acct_* rather than agent_* identities
- Fix heartbeat instruction: use 'message' field (not 'text'),
reference /hooks/agent endpoint, add sender name
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- sendHeartbeatInstruction now warns on non-OK responses instead of
silently treating them as success
- Guard webhook.eventTypes with optional chaining to prevent TypeError
- Replace Record<string, unknown> casts with typed EnableResponse interface
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Only show "try logging in again" for 401, not network errors
- Show HTTP status code for non-401 failures, "network error" otherwise
- Guard res.json() with .catch() for non-JSON responses
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add fetchAccountInfo() that returns HTTP status on failure so
whoamiCommand can distinguish 401 from other errors
- Keep getAccountInfo() as simple null-returning wrapper for callers
that don't need status details (e.g. notifications getEmailUserId)
- Document sendHeartbeatInstruction trust boundary for maintainers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- getMachineId: only fall back to hostname if it matches Fly machine
ID pattern (hex, 10+ chars), preventing accidental registration
from developer machines
- Validate API response shape before accessing nested properties
- Remove unused positionalArg parameter and 'add' alias
- Remove os import (now require'd inline in getMachineId)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove ~200 lines of non-functional code (list, remove, test,
re-enable, rotate-secret, failures, replay) that depend on broken
OAuth auth. Simplify help text to only show `enable`. Improve
whoami error message to mention token may be invalid/expired.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Only `notifications enable` works currently. The other commands
(list, remove, test, re-enable, rotate-secret, failures, replay)
require OAuth auth that isn't wired up yet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract getAccountInfo() as shared export from whoami.ts and use it
in webhook.ts to resolve the email local part (e.g. agent_xyz) for
cross-system event matching between email-mcp and atxp account IDs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fly sets FLY_MACHINE_ID on the VM but nested shells may not inherit it.
The hostname is also set to the machine ID, so use it as fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplified flow: CLI posts machine_id to /notifications/enable,
no OAuth required. Includes enable, list, remove, test, re-enable,
rotate-secret, failures, and replay subcommands.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous fix only passed -y to npx (to auto-install the skills
package) but not to the skills add command itself, which has its own
interactive confirmation prompts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenClaw's exec tool in allowlist mode blocks shell builtins like
`source` and command substitution `$()`. The CLI already reads
credentials from ~/.atxp/config directly via getConnection() — this
commit removes the shell-sourcing path entirely:
- Config format changed from `export ATXP_CONNECTION="value"` to plain
`ATXP_CONNECTION=value` (backward-compatible regex parses both)
- Deleted getShellProfile() and updateShellProfile() — no more shell
profile modification on login
- Login output now says "npx atxp whoami" instead of "source ~/.atxp/config"
- SKILL.md: removed grep/cut/source patterns, added OpenClaw Integration section
- README.md: replaced source instruction with whoami verification
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>