@heyamiko/amiko-cli 0.14.0-beta.2 → 0.14.0-beta.21
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/README.md +135 -15
- package/dist/index.js +3706 -4240
- package/package.json +1 -1
- package/skills/SKILL.md +80 -11
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @heyamiko/amiko-cli (v0.14.0-beta.
|
|
1
|
+
# @heyamiko/amiko-cli (v0.14.0-beta.15)
|
|
2
2
|
|
|
3
3
|
Manage wallets, credits, swaps, MPP marketplace services, and your Amiko twin (identity, documents, voice, avatar, friends, feed) from the terminal. Works for both human users and AI agents running on OpenClaw.
|
|
4
4
|
|
|
@@ -120,13 +120,21 @@ Image generation typically takes 20–60s. In non-TTY environments (agents, pipe
|
|
|
120
120
|
|
|
121
121
|
## Create Studio
|
|
122
122
|
|
|
123
|
-
The CLI half of the platform's Create Studio. `amiko create` generates media through Amiko's own authenticated endpoints (not the raw MPP pay-per-call surface `amiko markets` uses). Generation runs **asynchronously** and is **charged on success** from your twin's wallet — a failed or timed-out generation is never billed, and there's no up-front payment.
|
|
123
|
+
The CLI half of the platform's Create Studio. `amiko create` generates media through Amiko's own authenticated endpoints (not the raw MPP pay-per-call surface `amiko markets` uses). Generation runs **asynchronously** and is **charged on success** from your twin's wallet — a failed or timed-out generation is never billed, and there's no up-front payment. On unified-billing accounts, `--pay credits` pays from your Amiko account credits instead: the quote is reserved at submit, captured only on success, and released on failure (legacy accounts get a clear server error — omit the flag to keep the twin-wallet default).
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
|
-
amiko create image "a sunset over mountains" # default
|
|
127
|
-
amiko create image "logo" --aspect 16:9 --model gpt-image-2 # widescreen
|
|
126
|
+
amiko create image "a sunset over mountains" # default nano-banana-2, 1:1
|
|
127
|
+
amiko create image "logo" --aspect 16:9 --model gpt-image-2 # widescreen, OpenAI
|
|
128
|
+
amiko create image "a sunset" --pay credits --yes # pay with Amiko account credits (unified accounts)
|
|
128
129
|
amiko create video "a whale in space" --resolution 768P --seconds 6
|
|
130
|
+
amiko create video "animate cover" --first-frame https://.../cover.png --yes
|
|
131
|
+
amiko create video "dance clip" --model dreamina-seedance-2-0-fast-260128 \
|
|
132
|
+
--reference-image https://.../ref1.png --reference-audio https://.../beat.mp3 --generate-audio --yes
|
|
129
133
|
amiko create tts "Hello world" --voice 21m00Tcm4TlvDq8ikWAM
|
|
134
|
+
amiko create tts "Hello world" --provider minimax --model speech-2.8-turbo
|
|
135
|
+
amiko create tts "Hello" --provider minimax --voice English_expressive_narrator --yes
|
|
136
|
+
amiko voice clone ./me.mp3 --provider minimax
|
|
137
|
+
amiko voice clone ./me.mp3 --provider elevenlabs
|
|
130
138
|
amiko create music "lo-fi chill beat" --duration 30000
|
|
131
139
|
amiko create music --lyrics "..." --instrumental # instrumental
|
|
132
140
|
amiko create sfx "thunder and heavy rain" --duration 5
|
|
@@ -139,7 +147,8 @@ Modes: `image`, `video`, `tts`, `music`, `sfx` (mirrors the platform Create Stud
|
|
|
139
147
|
|
|
140
148
|
| Flag | Description |
|
|
141
149
|
|------|-------------|
|
|
142
|
-
| `--
|
|
150
|
+
| `--pay <method>` | Payment method: `wallet` (twin wallet, default) or `credits` (Amiko account credits — unified accounts only) |
|
|
151
|
+
| `--token <symbol>` | Wallet charge token: `AMIKO`, `USDC`, `USDT`, `SOL` (default: auto, AMIKO-first); ignored with `--pay credits` |
|
|
143
152
|
| `--yes` | Skip the pre-spend confirmation (required in non-interactive shells) |
|
|
144
153
|
| `--raw` | Output the raw job result as JSON |
|
|
145
154
|
|
|
@@ -147,25 +156,46 @@ Modes: `image`, `video`, `tts`, `music`, `sfx` (mirrors the platform Create Stud
|
|
|
147
156
|
|
|
148
157
|
| Flag | Default | Description |
|
|
149
158
|
|------|---------|-------------|
|
|
150
|
-
| `--model <model>` | `
|
|
159
|
+
| `--model <model>` | `nano-banana-2` | Image model (`nano-banana[-2|-lite|-pro]`, `gpt-image-*`, `grok-imagine-image-quality`, `image-01`) |
|
|
151
160
|
| `--aspect <ratio>` | `1:1` | Aspect ratio: `1:1`, `16:9`, `9:16`, `4:3`, `3:4` |
|
|
152
161
|
|
|
153
162
|
**`amiko create video <prompt>`**
|
|
154
163
|
|
|
155
164
|
| Flag | Default | Description |
|
|
156
165
|
|------|---------|-------------|
|
|
157
|
-
| `--model <model>` | `MiniMax-Hailuo-2.3-Fast`
|
|
166
|
+
| `--model <model>` | smart | Video model (`MiniMax-Hailuo-*`, `dreamina-seedance-2-0-fast-260128`, …). Default: `MiniMax-Hailuo-02` for prompt-only (T2V), `MiniMax-Hailuo-2.3-Fast` when `--first-frame` is given (I2V) |
|
|
158
167
|
| `--resolution <res>` | `768P` | `512P`, `720P`, `768P`, `1080P` |
|
|
159
168
|
| `--seconds <n>` | `6` | Clip length: `6` or `10` |
|
|
160
169
|
| `--aspect <ratio>` | — | Aspect ratio (provider-dependent) |
|
|
161
170
|
| `--first-frame <url>` | — | Image-to-video: first frame URL or data URI |
|
|
171
|
+
| `--last-frame <url>` | — | First-and-last-frame video: ending frame URL or data URI |
|
|
172
|
+
| `--reference-image <url>` | — | Seedance multimodal reference image (repeatable, max 9) |
|
|
173
|
+
| `--reference-video <url>` | — | Seedance multimodal reference video (repeatable, max 3) |
|
|
174
|
+
| `--reference-audio <url>` | — | Seedance multimodal reference audio (repeatable, max 3) |
|
|
175
|
+
| `--subject-reference <url>` | — | MiniMax S2V subject/character reference image |
|
|
176
|
+
| `--generate-audio` | — | Seedance: generate audio in the output |
|
|
177
|
+
| `--no-generate-audio` | — | Seedance: output silent video |
|
|
178
|
+
|
|
179
|
+
Reference flags accept URLs or data URIs (not local paths). Typical I2V flow: `create image` → `create status <jobId>` for the image URL → `create video --first-frame <url>`.
|
|
162
180
|
|
|
163
181
|
**`amiko create tts <text>`**
|
|
164
182
|
|
|
165
183
|
| Flag | Default | Description |
|
|
166
184
|
|------|---------|-------------|
|
|
167
|
-
| `--
|
|
168
|
-
| `--
|
|
185
|
+
| `--provider <name>` | inferred / `elevenlabs` | `minimax` or `elevenlabs` — sets model/voice defaults when those flags are omitted |
|
|
186
|
+
| `--model <model>` | EL: `eleven_multilingual_v2`; MiniMax: `speech-2.8-turbo` | MiniMax: `speech-2.8-turbo\|hd`, `speech-2.6-turbo\|hd`. ElevenLabs: `eleven_*` |
|
|
187
|
+
| `--voice <voiceId>` | EL default hash; MiniMax: `English_expressive_narrator` | MiniMax system or cloned `voice_id`; ElevenLabs voice id |
|
|
188
|
+
|
|
189
|
+
Examples: `amiko create tts "Hi" --provider minimax --yes` · `amiko create tts "Hi" --provider minimax --model speech-2.8-turbo --voice <clonedId> --yes`
|
|
190
|
+
|
|
191
|
+
**`amiko voice clone <source>`** — audio path, https URL, or `-` (stdin)
|
|
192
|
+
|
|
193
|
+
| Flag | Default | Description |
|
|
194
|
+
|------|---------|-------------|
|
|
195
|
+
| `--provider <name>` | `minimax` | `minimax` (mpp rapid clone + ownership registry) or `elevenlabs` (legacy IVC) |
|
|
196
|
+
| `--voice-id <id>` | auto | **MiniMax only** — optional custom voice_id (ignored for elevenlabs) |
|
|
197
|
+
| `--model <model>` | `speech-2.8-turbo` | **MiniMax only** — preview speech model (ignored for elevenlabs) |
|
|
198
|
+
| `--preview-text <text>` | provider default | **MiniMax only** — preview line; empty string skips preview (ignored for elevenlabs) |
|
|
169
199
|
|
|
170
200
|
**`amiko create music [prompt]`** — pass a prompt and/or `--lyrics`
|
|
171
201
|
|
|
@@ -222,15 +252,52 @@ amiko chat list --limit 50 --archived # include archived
|
|
|
222
252
|
amiko chat read @sophie # recent messages with a user (by @handle)
|
|
223
253
|
amiko chat read <conversationId> --limit 40 # by conversation id (from `chat list`) — works for groups too
|
|
224
254
|
amiko chat send @sophie "on my way!" --yes # send as the owner
|
|
255
|
+
amiko chat send <userId> "hey!" --yes # user id works too — the DM is opened automatically
|
|
256
|
+
amiko chat send Mars "hey!" --yes # or a name (friends first, then people search)
|
|
225
257
|
amiko chat send <groupConversationId> "hi all" --yes # send to a group chat
|
|
258
|
+
amiko chat send "Trip planning" "standup in 5 @all" --yes # @all — notifies every group member
|
|
259
|
+
amiko chat send "Trip planning" "standup in 5" --all --yes # same, via the explicit flag
|
|
226
260
|
amiko chat send @sophie "look 👀" --image ./cat.png --yes # attach a local image
|
|
227
261
|
amiko chat send @sophie "made this 🎵" --audio <generated-url> --yes # attach audio (e.g. from `amiko create`)
|
|
262
|
+
amiko chat send @sophie --gif "happy dance" --yes # send the top Klipy GIF for a search (message optional)
|
|
263
|
+
amiko chat gifs "happy dance" # browse GIFs first, then send a specific one:
|
|
264
|
+
amiko chat send @sophie "we did it!" --gif <gifUrl> --yes # attach an exact GIF by its Klipy URL
|
|
265
|
+
amiko chat receipts <messageId> # who read your message + when (id from `chat read`)
|
|
266
|
+
amiko chat pin <messageId> --yes # pin for everyone (id from `chat read`; groups: admins only)
|
|
267
|
+
amiko chat unpin <messageId> --yes # remove a pin for everyone
|
|
268
|
+
amiko chat pinned "Trip planning" # list a conversation's pinned messages, oldest first
|
|
228
269
|
```
|
|
229
270
|
|
|
230
|
-
- **`<target>`** for `read`/`send` is a **conversation id** (from `chat list` — use this for groups), an **`@handle`**, or a **name**
|
|
231
|
-
-
|
|
232
|
-
- **Inline media**: `--image <pathOrUrl>` (jpg/png/webp/gif, local ≤10MB or an Amiko URL)
|
|
271
|
+
- **`<target>`** for `read`/`send` is a **conversation id** (from `chat list` — use this for groups), a **user id**, an **`@handle`**, or a **name**. Names resolve against your **friends first**, then people search; if ambiguous, the CLI lists candidates instead of guessing. A cuid that isn't one of your conversations is retried as a user id, so pasting a user id "just works".
|
|
272
|
+
- `send` to a person you have no DM with yet **creates the DM automatically** (find-or-create, after the confirmation). `read` never creates one — it errors if no DM exists yet.
|
|
273
|
+
- **Inline media**: `--image <pathOrUrl>` (jpg/png/webp/gif, local ≤10MB or an Amiko URL), `--audio <pathOrUrl>` (local ≤25MB or an Amiko URL → sent as a voice note), and `--gif <queryOrUrl>` (search words send the **top Klipy result**; or pass an exact Klipy URL from `amiko chat gifs` — non-Klipy URLs are refused; to send another image, use `--image` with a local file or an Amiko URL). One media block per message (image *or* audio *or* gif). **General video files aren't supported in chat yet.** A local file is uploaded; an Amiko URL (e.g. a generated asset from `amiko create`) attaches directly with no re-upload. (A local *audio* file is sent as a voice note, with your text as a separate message.)
|
|
274
|
+
- **GIFs**: `amiko chat gifs [query]` lists Klipy GIFs (trending with no query; `--page`/`--limit`/`--raw`) — read-only and ungated, powered by KLIPY. The message text is optional with `--gif` (a captionless GIF sends as just the GIF); a caption renders under the GIF on every client.
|
|
275
|
+
- **@all in groups**: `--all` prepends an @all mention, and a standalone `@all` word typed in the message converts too — either way **every member** is notified. Group **admins/owners** can always use it; everyone else only after an admin runs `amiko chat group mention-all <group> on`. Without permission, `--all` fails with the fix named, while a typed `@all` is delivered as plain text (with a note). Incoming mention markup renders as plain `@name`/`@all` in `chat read` and `chat list`.
|
|
233
276
|
- `chat send` messages a real person, so it's **gated on `--yes`** in non-interactive shells. Delivery is real-time. `--raw` prints raw JSON on any subcommand.
|
|
277
|
+
- **`chat receipts <messageId>`** shows read receipts for **your own** messages (server-enforced; 403 otherwise): sent time, who read it with each person's first-read time, and who it was delivered to but hasn't read. Reads from before receipts tracking show as "exact time unknown". Read-only, ungated.
|
|
278
|
+
- **Pinned messages**: `chat pin <messageId>` pins for the **whole conversation** (the chat sees an "X pinned a message" announcement) and `chat unpin <messageId>` removes it for everyone — both gated on `--yes`. In **groups** only admins can pin/unpin (403 otherwise); in DMs either side can. Max 20 pins per conversation. `chat pinned <target>` (same targets as `read`; never creates a DM) lists them oldest-first with each message's id and pinner — read-only, ungated.
|
|
279
|
+
|
|
280
|
+
### Group chats
|
|
281
|
+
|
|
282
|
+
Create and manage group chats **as the owner** via `amiko chat group`:
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
amiko chat group create "Leandro testing" --member Sophie --member Mars --member Matthew --yes
|
|
286
|
+
amiko chat group list # your group chats: title, id, member count, unread
|
|
287
|
+
amiko chat group info "Leandro testing" # members + roles (admins marked); works with the id too
|
|
288
|
+
amiko chat group rename <groupIdOrTitle> "New name" --yes
|
|
289
|
+
amiko chat group add <groupIdOrTitle> --member @sophie --yes
|
|
290
|
+
amiko chat group remove <groupIdOrTitle> --member Mars --yes
|
|
291
|
+
amiko chat group promote <groupIdOrTitle> --member Sophie --yes # make a member an admin
|
|
292
|
+
amiko chat group mention-all <groupIdOrTitle> on --yes # let everyone use @all (off = admins only, the default)
|
|
293
|
+
amiko chat group leave <groupIdOrTitle> --yes # alias: delete — see caveat below
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
- **`--member`** is repeatable and accepts a plain name, `@handle`, or user id. Plain names resolve against your **friends** first (then people search); an ambiguous name errors listing candidates instead of guessing, and one unresolvable member aborts the whole command **before anything is changed**.
|
|
297
|
+
- **Groups address by id or title** — titles match case-insensitively (exact first, then substring) across your most recent 100 conversations; ambiguous titles error with candidates. `chat send "<group title>" "hi" --yes` also works when exactly one group title matches.
|
|
298
|
+
- **`leave` (alias `delete`) only hides the group for you.** Other members keep the conversation and its history — the platform has no delete-for-everyone. Rename, add, remove-others, promote, and the @all toggle are **admin-only** (the creator is admin); the server enforces this.
|
|
299
|
+
- **`mention-all <group> <on|off>`** controls who may @all in the group: `on` lets every member, `off` (the default) restricts it to admins. The current setting shows in `amiko chat group info` as `@all mentions: everyone | admins only`.
|
|
300
|
+
- `create`/`add` are outward social actions and `rename`/`remove`/`leave`/`promote`/`mention-all` are destructive, so all are **gated on `--yes`** in non-interactive shells. `--raw` prints JSON everywhere.
|
|
234
301
|
|
|
235
302
|
## Twin Cards
|
|
236
303
|
|
|
@@ -309,8 +376,11 @@ amiko markets service call POST /v1/sfx '{"text":"Thunder with heavy rain","dura
|
|
|
309
376
|
# Music generation ($0.10) — returns { url, format, service }
|
|
310
377
|
amiko markets service call POST /v1/music '{"prompt":"Lo-fi chill beat","music_length_ms":30000}'
|
|
311
378
|
|
|
312
|
-
# Text-to-speech
|
|
379
|
+
# Text-to-speech — ElevenLabs voice id (default)
|
|
313
380
|
amiko markets service tts 21m00Tcm4TlvDq8ikWAM "Hello world"
|
|
381
|
+
# MiniMax system or cloned voice_id
|
|
382
|
+
amiko markets service tts English_expressive_narrator "Hello" --provider minimax --yes
|
|
383
|
+
amiko markets service tts <clonedId> "Hello" --provider minimax --model speech-2.8-turbo --yes
|
|
314
384
|
|
|
315
385
|
# Composition plan ($0.02)
|
|
316
386
|
amiko markets service call POST /v1/music/plan '{"prompt":"Epic orchestral piece"}'
|
|
@@ -443,7 +513,7 @@ src/
|
|
|
443
513
|
│ ├── avatar.ts # avatar update
|
|
444
514
|
│ ├── friends.ts # friends list, requests, add, accept, remove, matches, reports
|
|
445
515
|
│ ├── users.ts # users search, profile
|
|
446
|
-
│ └── feed.ts # feed, post create, post comment
|
|
516
|
+
│ └── feed.ts # feed, post create/drafts/publish, post comment
|
|
447
517
|
└── lib/
|
|
448
518
|
├── config.ts # defaults + resolved auth wrapper
|
|
449
519
|
├── agent-config.ts # .amiko.json reader + auth resolution
|
|
@@ -501,9 +571,12 @@ amiko users profile <handle> # public profile
|
|
|
501
571
|
# Feed & posts
|
|
502
572
|
amiko feed # friends feed (default)
|
|
503
573
|
amiko feed --type for_you --limit 20
|
|
504
|
-
amiko post create --content "hello from the CLI" # public post
|
|
574
|
+
amiko post create --content "hello from the CLI" # public post — prints the canonical share URL (post_url in --json); share that verbatim, never hand-build one from the id
|
|
505
575
|
amiko post create --content "private note" --visibility private
|
|
506
576
|
amiko post create --content "look" --media https://...jpg
|
|
577
|
+
amiko post create --content "wip idea" --draft # save a draft — no share URL until published
|
|
578
|
+
amiko post drafts # list draft posts (--limit/--offset/--json)
|
|
579
|
+
amiko post publish <postId> # publish a draft (fresh timestamp, prints the share URL)
|
|
507
580
|
amiko post comment --id <postId> --comment "great post"
|
|
508
581
|
amiko post comment --id <postId> --comment "nice!" --media https://...jpg
|
|
509
582
|
```
|
|
@@ -528,6 +601,53 @@ npm publish
|
|
|
528
601
|
|
|
529
602
|
## Changelog
|
|
530
603
|
|
|
604
|
+
### 0.14.0-beta.21
|
|
605
|
+
|
|
606
|
+
- **Chat GIFs: `amiko chat gifs [query]` + `amiko chat send --gif <queryOrUrl>`.** `chat gifs` browses Klipy GIFs via the platform proxy (`GET /api/gifs`; trending with no query, `--page`/`--limit`/`--raw`, "Powered by KLIPY") — read-only and ungated. `chat send --gif` attaches a GIF to a message: search words send the top result, a Klipy URL (from `chat gifs`) attaches exactly, and non-Klipy URLs are refused. Sends use the cross-client GIF contract — Klipy mp4/webm → `message_type: "video"` + `metadata.videos`, `.gif` → `"image"` + `metadata.images`, each record `{url, name, contentType, kind: "gif", width?, height?}` — so web/desktop/mobile render a looping watermarked GIF. The `<message>` positional is now optional when `--gif` is present (`content` falls back to `"GIF"`); captions ride as `metadata.image_caption`, which the `--image` path now also sets so image captions actually display in bubbles. One media block per message (`--image`/`--audio`/`--gif` are mutually exclusive). Requires the companion amiko-web `feat/chat-gif-picker` deploy (`GET /api/gifs`) — the twin token already authenticates against it, so no other backend work is needed.
|
|
607
|
+
|
|
608
|
+
### 0.14.0-beta.20
|
|
609
|
+
|
|
610
|
+
- **Draft posts: `amiko post create --draft`, `amiko post drafts`, `amiko post publish <postId>`.** `--draft` saves via `POST /api/posts { status: "draft" }` — no side effects fire and no share URL is printed (drafts 404 by id until published; success copy says "Draft saved" with a publish hint, and `post_url` is omitted from `--json`). `drafts` lists the owner's draft posts (`GET /api/posts?status=draft`, offset pagination via `--limit`/`--offset`; owner-wide across all the owner's twins). `publish` PATCHes `{ status: "published" }`, stamps a fresh timestamp, fires mention/hashtag notifications, and prints the canonical share URL; a 404 points at `amiko post drafts` since drafts can't be fetched by id. Requires the amiko-web draft-posts API (`feat/draft-posts`).
|
|
611
|
+
|
|
612
|
+
### 0.14.0-beta.19
|
|
613
|
+
|
|
614
|
+
- **Pinned messages: `amiko chat pin <messageId>`, `amiko chat unpin <messageId>`, `amiko chat pinned <target>`.** Pins are conversation-wide: `pin` posts an "X pinned a message" announcement to the whole chat (POST `/api/messages/{id}/pin`), so it sits behind the outward-action `--yes` gate with a content preview; `unpin` (DELETE, silent but removes shared state for everyone) sits behind the destructive gate. Groups are admin-gated server-side — a 403 names the rule and the `chat group info` check; DMs let either side pin. 409 at the 20-pin cap and 400 for unpinnable (system/in-flight) messages get status-specific copy. `pinned <target>` is an ungated read using the same target resolution as `chat read` (conversation id, user id, `@handle`, or name; never creates a DM), listing pins oldest-first with sender, message id, and pinner name; `--raw` on all three. Requires the companion amiko-web `feat/chat-pinned-messages` deploy.
|
|
615
|
+
|
|
616
|
+
### 0.14.0-beta.18
|
|
617
|
+
|
|
618
|
+
- **Read receipts: `amiko chat receipts <messageId>`.** Shows when the message was sent, who has read it (per-person first-read time), and who it was delivered to but hasn't read yet. Sender-only, enforced server-side — works for messages sent as the owner (`chat send`); anything else 403s with a clear message. Reader names resolve from the conversation's participant list (short-id fallback). Read-only and ungated, like `chat reactions`; `--raw` prints the API payload. Rows read before receipts tracking existed render as "exact time unknown". Requires the companion amiko-web `feat/chat-read-receipts` deploy (`GET /api/messages/{id}/receipts`).
|
|
619
|
+
|
|
620
|
+
### 0.14.0-beta.17
|
|
621
|
+
|
|
622
|
+
- **@all mentions in group chats + `amiko chat group mention-all <group> <on|off>`.** `chat send` gains `--all`, and a standalone literal `@all` word in the message converts too — both emit the canonical sentinel `@[all](all:all)` (kept in sync with amiko-web `src/utils/mentions.ts`), which amiko-chat expands into a mention notification for every group member. The CLI pre-checks permission client-side, mirroring the web gate plus the server-honored `owner` role (`admin`/`owner`, or the conversation's `allow_everyone_mention_all` flag; `left_at` participants excluded): a denied `--all` exits 1 naming the fix, before the approval gate and before any DM could be created, while a denied literal `@all` degrades to plain text with a note — the server treats an unauthorized token as inert either way. The new `chat group mention-all` toggle PATCHes `/api/conversations/{id}/mention-all-permission` (admin-gated server-side, 403 → admin tip) behind `confirmDestructive`, and the current setting shows in `chat group info` (`@all mentions: everyone | admins only`). Incoming mention markup (`@[Name](id:user|agent)` / `@[all](all:all)`) now renders as plain `@Name`/`@all` in `chat read`, `chat list`, and `chat group list` previews (new `src/lib/mentions.ts`). Requires the companion amiko-web `feat/group-mention-all` deploy.
|
|
623
|
+
|
|
624
|
+
### 0.14.0-beta.15
|
|
625
|
+
|
|
626
|
+
- Create Studio defaults to `--pay credits` (account credits) instead of twin wallet; pass `--pay wallet` for on-chain.
|
|
627
|
+
|
|
628
|
+
### 0.14.0-beta.14
|
|
629
|
+
|
|
630
|
+
- `credits balance` prefers `AMIKO_API_KEY` (`amk_`) → `billing.heyamiko.com/api/credits` directly; falls back to twin-token platform proxy. Override base with `AMIKO_BILLING_URL`.
|
|
631
|
+
|
|
632
|
+
### 0.14.0-beta.13
|
|
633
|
+
|
|
634
|
+
- **Create Studio TTS + voice clone: MiniMax.** `amiko create tts` accepts `--provider minimax|elevenlabs` (infers from `speech-*` / `eleven_*` models when omitted), with provider-specific defaults (`speech-2.8-turbo` + `English_expressive_narrator` vs `eleven_multilingual_v2` + Rachel). Quote body includes `voiceId`. Cloned-voice examples require `--provider minimax` when using a MiniMax `voice_id`.
|
|
635
|
+
- **`amiko voice clone`** defaults to MiniMax (mpp rapid clone + ownership registry); `--provider elevenlabs` keeps legacy IVC. MiniMax-only flags: `--voice-id`, `--model`, `--preview-text`.
|
|
636
|
+
- **`amiko markets service tts`** gains `--provider minimax|elevenlabs` and `--model` for MiniMax speech routing on `/v1/tts/:voiceId`.
|
|
637
|
+
|
|
638
|
+
### 0.14.0-beta.7
|
|
639
|
+
|
|
640
|
+
- **`amiko chat group invite <group>` — share a group's invite/join link + QR.** New read-only subcommand that fetches `GET /api/conversations/{id}/invite` (twin token) and prints the join link plus a scannable QR image URL. Admins-only: SKILL.md instructs the agent to confirm the asker holds `admin`/`owner` (via `amiko chat group info`) before sharing, and the endpoint is admin-gated server-side (403 → admin tip). Fails loudly if the response is missing its link/QR instead of printing a placeholder. Requires the companion amiko-web change (adds `qrUrl` to the invite response + a public `GET /api/conversations/join/[token]/qr` PNG route).
|
|
641
|
+
|
|
642
|
+
### 0.14.0-beta.6
|
|
643
|
+
|
|
644
|
+
- **`amiko chat send`/`read` accept user ids — DMs no longer require an existing conversation.** Target resolution is rebuilt: a cuid target is verified as a conversation first and, on 404, retried as a user id (user ids and conversation ids are both cuids — previously a user id went straight to the messages route and died with "Conversation not found"). Plain names now resolve **friends-first** (then people search) via the shared `resolveMembers`, with ambiguity reported as a candidate list. Resolution is fully read-only: for `send`, a missing DM is found-or-created only **after** the `--yes`/approval gate (no more empty conversations from an unapproved send), and `read` never creates a DM at all — it errors if none exists. The confirmation summary now shows the **resolved** recipient (`Send to DM with Mars (@mars): …`) so a wrong-person resolution is visible before anything goes out. Unknown cuids are rejected before any conversation is created (the backend accepts dangling participant ids silently), and a 403 on a real conversation no longer falls through to DM creation.
|
|
645
|
+
- **Free outward actions no longer talk about cost.** `requireApproval` gained a `free` mode used by `chat send` and `chat group create/add`: the non-interactive refusal now says the action is free and tells the agent to confirm the action itself — instead of the old "This command will cost no charge… quote the cost to the user", which made twins ask owners to "approve the paid operation, cost 0". SKILL.md's Critical Rule 1 spells out the anti-pattern, documents user-id DM targets ("the owner never needs to start the conversation first"), and drops the false "server enforces friend rules" claim that fed authorization hallucinations.
|
|
646
|
+
|
|
647
|
+
### 0.14.0-beta.5
|
|
648
|
+
|
|
649
|
+
- **`amiko chat group` — group-chat management as the owner.** New subcommand group under `chat`: `create` (name + repeatable `--member`, one atomic POST), `list`, `info` (members + roles), `rename`, `add`, `remove`, `promote`, and `leave` (alias `delete`). Members resolve friends-first by name (then people search), all-or-nothing before any mutation; groups address by id or case-insensitive title. Uses the existing amiko-web conversation routes (twin token) — rename/add/remove-others/promote are admin-enforced server-side, and `leave|delete` is honest about the platform's semantics: it only hides the group for the caller, there is no delete-for-everyone. `create`/`add` gate on `requireApproval`, the destructive rest on `confirmDestructive` (both exit 2 without `--yes` in non-interactive shells). Plain-name `chat send`/`read` targets now prefer an exact, unambiguous group-title match over people search. Shared conversation types + resolution helpers extracted to `src/lib/conversations.ts`; `convLabel` self-filtering now strips the `did:privy:` prefix so DM labels no longer include the owner. SKILL.md gains a Group chats block + gating-list updates.
|
|
650
|
+
|
|
531
651
|
### 0.14.0-beta.0
|
|
532
652
|
|
|
533
653
|
- **Direct USDC/USDT payment for MPP marketplace services (Bug #9).** `markets search`, `markets image`, and `markets amazon search` gain `--token <AMIKO|USDC|USDT>`; `markets service call` completes its `--usdc` path and adds `--usdt` (both accept `auto` to price from the endpoint's USD anchor). Stables are pinned at $1.00 — no forced swap to AMIKO and no credits conversion. Requires the matching mpp-service deploy: `charge()`/`chargeAmiko()` now read `X-Payment-Token` and verify the on-chain transfer against that token's mint (`verifySplTransfer`), with a ±0.5% tolerance for stables (±5% stays for AMIKO spot drift). Also fixes stale hardcoded amounts: `markets search` / `amazon search` paid a flat "1 AMIKO" regardless of spot — under current prices that under-pays the $0.01 anchor and fails verification; amounts are now quoted live before the approval gate, which shows the real cost instead of "1 AMIKO". Shared payment plumbing extracted to `src/lib/treasury-payment.ts` (one TREASURY constant, one transfer path).
|