@ghostystudio/cli 0.31.0 → 0.32.0

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.
Files changed (3) hide show
  1. package/README.md +1 -0
  2. package/dist/index.js +71 -20
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -73,6 +73,7 @@ ghosty schedule rm <id> <schedule-id>
73
73
  ghosty schedule add|ls|rm <id> … --teams <workspace>#<room>[/<thread-id>] # in a Teams room/thread: it answers there as if mentioned
74
74
 
75
75
  ghosty me files ls|get|upload|rm [--q TEXT] [--kind image|video|audio|document|other] [--cursor C]
76
+ ghosty me memories ls|add|edit|rm [--agent A]
76
77
  ghosty conversations archive|rm <id> --kind test|channel [--before 7d] [--dry-run]
77
78
  ghosty agents docs dedupe [--dry-run] # your account: merge documents with the same content
78
79
  # Ghosty staff
package/dist/index.js CHANGED
@@ -8055,6 +8055,16 @@ var SERVER_MESSAGES = [
8055
8055
  ["~ WabaLink {}: s\xF3lo anuncios {} \u2192 {}", "~ WabaLink {}: ads only {} \u2192 {}"],
8056
8056
  [" s\xF3lo anuncios: on (s\xF3lo abre tarjeta lo que viene de un anuncio)", " ads only: on (only what comes from an ad opens a card)"],
8057
8057
  [" s\xF3lo anuncios: off", " ads only: off"],
8058
+ // — Memorias e hilo largo
8059
+ ["no existe esa memoria (revisa memory_list)", "that memory doesn't exist (check memory_list)"],
8060
+ ["no existe esa memoria", "that memory doesn't exist"],
8061
+ ["la memoria est\xE1 vac\xEDa", "the memory is empty"],
8062
+ ["una memoria cabe en {} caracteres", "a memory fits in {} characters"],
8063
+ ["ya hay {} memorias; borra alguna antes de guardar otra", "there are already {} memories; delete one before saving another"],
8064
+ ["no se pudo guardar la memoria", "couldn't save the memory"],
8065
+ ["las memorias s\xF3lo se tocan en el chat personal de la persona", "memories can only be changed in the person's personal chat"],
8066
+ ["la persona la ve y la edita en Memorias de su app", "the person sees and edits it in Memories in their app"],
8067
+ ["No pude abrir el chat nuevo: {}", "Couldn't open the new chat: {}"],
8058
8068
  // — Infra interna (casi nunca llega al CLI, pero por si acaso)
8059
8069
  ["SESSION_SECRET ausente en producci\xF3n \u2014 las cookies quedar\xEDan firmadas con un valor p\xFAblico. Inyectarlo con ./scripts/set_gs_secret.sh SESSION_SECRET (openssl rand -hex 32).", "SESSION_SECRET missing in production \u2014 cookies would be signed with a public value. Inject it with ./scripts/set_gs_secret.sh SESSION_SECRET (openssl rand -hex 32)."],
8060
8070
  ["sqld: fetch sin namespace", "sqld: fetch without namespace"],
@@ -8357,7 +8367,7 @@ async function postLong(path, body, timeoutMs = 9e5) {
8357
8367
  const req = httpsRequest(`${base}${path}`, {
8358
8368
  method: "POST",
8359
8369
  timeout: timeoutMs,
8360
- headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.31.0"}`, "content-type": "application/json", "content-length": Buffer.byteLength(data) }
8370
+ headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.32.0"}`, "content-type": "application/json", "content-length": Buffer.byteLength(data) }
8361
8371
  }, (res) => {
8362
8372
  let buf = "";
8363
8373
  res.on("data", (c) => buf += c);
@@ -8399,7 +8409,7 @@ async function request(path, opts = {}, retried = false) {
8399
8409
  method: opts.method ?? (opts.body !== void 0 || opts.raw !== void 0 ? "POST" : "GET"),
8400
8410
  headers: {
8401
8411
  authorization: `Bearer ${token}`,
8402
- "user-agent": `ghosty-cli/${"0.31.0"}`,
8412
+ "user-agent": `ghosty-cli/${"0.32.0"}`,
8403
8413
  "accept-language": lang(),
8404
8414
  ...opts.body !== void 0 ? { "content-type": "application/json" } : {},
8405
8415
  ...opts.headers
@@ -9251,6 +9261,36 @@ async function readAll() {
9251
9261
  for await (const c of process.stdin) s += c;
9252
9262
  return s;
9253
9263
  }
9264
+ async function meMemories(sub, arg, text, v) {
9265
+ const ex = 'ghosty me memories ls [--agent A] | add "texto" [--agent A] | edit <id> "texto" | rm <id>';
9266
+ switch (sub ?? "ls") {
9267
+ case "ls": {
9268
+ const r = await api(`/api/v2/me/memories${v.agent ? `?agente=${enc3(v.agent)}` : ""}`);
9269
+ out(r, () => {
9270
+ const rows = r.memories.map((m) => ({ id: m.id, memory: m.content, agent: m.agentId ?? t("all", "todos"), from: m.source }));
9271
+ return rows.length ? table(rows, ["id", "memory", "agent", "from"]) : dim(t('Nothing yet. Add one: ghosty me memories add "I prefer short answers"', 'A\xFAn nada. Agrega una: ghosty me memories add "prefiero respuestas cortas"'));
9272
+ });
9273
+ return;
9274
+ }
9275
+ case "add": {
9276
+ if (!arg) throw usage(t("Missing the memory text.", "Falta el texto de la memoria."), ex);
9277
+ const r = await api(`/api/v2/me/memories`, { method: "POST", body: { content: arg, agentId: v.agent ?? null } });
9278
+ return out(r, () => `${lavender("\u2713")} ${t("Saved", "Guardada")} (${r.memory.id})`);
9279
+ }
9280
+ case "edit": {
9281
+ if (!arg || !text) throw usage(t("Missing the id or the new text.", "Falta el id o el texto nuevo."), ex);
9282
+ const r = await api(`/api/v2/me/memories/${enc3(arg)}`, { method: "PATCH", body: { content: text } });
9283
+ return out(r, () => `${lavender("\u2713")} ${t("Updated", "Actualizada")} (${r.memory.id})`);
9284
+ }
9285
+ case "rm": {
9286
+ if (!arg) throw usage(t("Missing the memory id.", "Falta el id de la memoria."), ex);
9287
+ const r = await api(`/api/v2/me/memories/${enc3(arg)}`, { method: "DELETE" });
9288
+ return out(r, () => `${lavender("\u2713")} ${t("Forgotten", "Olvidada")}`);
9289
+ }
9290
+ default:
9291
+ throw usage(t(`Unknown memories subcommand: ${sub}.`, `Subcomando de memories desconocido: ${sub}.`), ex);
9292
+ }
9293
+ }
9254
9294
  async function meFiles(sub, arg, v) {
9255
9295
  const ex = "ghosty me files ls [--q TEXT] [--kind image|video|audio|document|other] [--cursor C] | get <file-id> [--out FILE] | upload <file> | rm <file-id>";
9256
9296
  switch (sub) {
@@ -9529,7 +9569,7 @@ async function call(path, v, init = {}) {
9529
9569
  "x-ghosty-ts": ts,
9530
9570
  "x-ghosty-sig": sig,
9531
9571
  "content-type": "application/json",
9532
- "user-agent": `ghosty-cli/${"0.31.0"}`
9572
+ "user-agent": `ghosty-cli/${"0.32.0"}`
9533
9573
  },
9534
9574
  body: method === "GET" ? void 0 : raw
9535
9575
  });
@@ -10841,7 +10881,7 @@ var HELPS_ES = {
10841
10881
  },
10842
10882
  turns: {
10843
10883
  summary: "Los turnos recientes de un agente: qu\xE9 contest\xF3, qu\xE9 fall\xF3 y por qu\xE9, y en qu\xE9 se fue el tiempo de un turno.",
10844
- replace: [["# last turn: each tool, its seconds, output tokens", "# \xFAltimo turno: cada tool, sus segundos, tokens de salida"], ["# stop the turn AND its background jobs", "# detiene el turno Y sus encargos en fondo"], ["# staff: real failure rate by engine and error", "# staff: tasa real de fallos por motor y por error"]],
10884
+ replace: [["# last turn: each tool, its seconds, output tokens", "# \xFAltimo turno: cada tool, sus segundos, tokens de salida"], ["# stop the turn AND its background jobs", "# detiene el turno Y sus encargos en fondo"], ["# staff: real failure rate by engine, channel (Teams/A2A too) and error", "# staff: tasa real de fallos por motor, canal (tambi\xE9n Teams y A2A) y error"]],
10845
10885
  flags: [
10846
10886
  ["--errors", "s\xF3lo turnos fallidos (igual que --status error)"],
10847
10887
  ["--skipped", "ls: mensajes de clientes de WhatsApp Business que NO abrieron turno, y por qu\xE9 (operador activo, s\xF3lo registra, pausa, reacci\xF3n, canal apagado, sin saldo)"],
@@ -10897,7 +10937,10 @@ var HELPS_ES = {
10897
10937
  replace: [['"what to do"', '"qu\xE9 hacer"'], ["# answers in that thread as if mentioned", "# contesta en ese hilo como si lo mencionaran"]],
10898
10938
  notes: ["--teams: el agente tiene que estar activo en el Teams de ese espacio y t\xFA ser miembro. El id del hilo es el del mensaje con que empieza."]
10899
10939
  },
10900
- me: { summary: "Tu cuenta: archivos y uso." },
10940
+ me: {
10941
+ summary: "Tu cuenta: archivos, memorias y uso.",
10942
+ notes: ["Las memorias viajan a tus agentes s\xF3lo en tus chats personales (app, /c, notch), nunca a WhatsApp, Messenger ni demos. --agent la limita a ese agente."]
10943
+ },
10901
10944
  credentials: {
10902
10945
  summary: "Llaves de proveedores en la b\xF3veda de tu cuenta (cifradas; s\xF3lo regresan los \xFAltimos 4 caracteres).",
10903
10946
  replace: [["# hidden prompt", "# pregunta oculta"]],
@@ -11073,7 +11116,7 @@ var HELPS_ES = {
11073
11116
  },
11074
11117
  novedades: {
11075
11118
  summary: "Staff de Ghosty: las novedades de la app Android. Cada una con su ilustraci\xF3n; mismos frenos que el admin: pru\xE9bala en tu tel\xE9fono primero, push de 9 a 21 h CDMX, 72 h entre env\xEDos a todos.",
11076
- notes: ["--image se publica en img.ghosty.studio (WebP 1200 px). --to vac\xEDo = todos. send sin --at la manda ya (pregunta); --at '' quita la programaci\xF3n."]
11119
+ notes: ["--image se publica en img.ghosty.studio (WebP 1200 px). --to vac\xEDo = todos. send sin --at la manda ya (pregunta); --at '' quita la programaci\xF3n.", "--min-version N (versionCode de Android): si la app del tester es m\xE1s vieja, el bot\xF3n dice \xABActualizar\xBB y lanza la actualizaci\xF3n de Play desde la app; '' la quita."]
11077
11120
  },
11078
11121
  spaces: {
11079
11122
  summary: "Espacios: lista los tuyos (o, staff, los de cualquiera) y operaciones del staff de Ghosty \u2014 entrar/salir del espacio de un cliente, cambiar su combo, mover \xABpagado hasta\xBB, renombrar su slug. Cada cambio queda en la bit\xE1cora del espacio.",
@@ -11275,7 +11318,7 @@ var HELPS = {
11275
11318
  },
11276
11319
  turns: {
11277
11320
  summary: "An agent's recent turns: what answered, what failed and why, and where one turn's time went.",
11278
- usage: ["ghosty turns ls <agent-id> [--errors | --status STATE | --skipped] [--since 1h] [--limit N]", "ghosty turns ls --workspace <slug> --quota-hits [--days 14]", "ghosty turns show <agent-id> [turn-id | last] [--full]", "ghosty turns cancel <agent-id> <conversation-id> # stop the turn AND its background jobs", "ghosty turns stats [--since 14d] [--all] # staff: real failure rate by engine and error"],
11321
+ usage: ["ghosty turns ls <agent-id> [--errors | --status STATE | --skipped] [--since 1h] [--limit N]", "ghosty turns ls --workspace <slug> --quota-hits [--days 14]", "ghosty turns show <agent-id> [turn-id | last] [--full]", "ghosty turns cancel <agent-id> <conversation-id> # stop the turn AND its background jobs", "ghosty turns stats [--since 14d] [--all] # staff: real failure rate by engine, channel (Teams/A2A too) and error"],
11279
11322
  flags: [
11280
11323
  ["--errors", "only failed turns (same as --status error)"],
11281
11324
  ["--skipped", "ls: WhatsApp Business customer messages that did NOT open a turn, and why (operator active, records only, paused, reaction, channel off, no balance)"],
@@ -11366,9 +11409,10 @@ var HELPS = {
11366
11409
  learn: `${REF}#programar-turnos`
11367
11410
  },
11368
11411
  me: {
11369
- summary: "Your account: files and usage.",
11370
- usage: ["ghosty me files ls [--q TEXT] [--kind image|video|audio|document|other] [--cursor C]", "ghosty me files get <file-id> [--out FILE]", "ghosty me files upload <file> | rm <file-id>", "ghosty usage"],
11371
- examples: ["ghosty me files ls --kind document", "ghosty me files ls --q contrato", "ghosty me files get <id> --out contrato.pdf", 'ghosty chat <agent> "res\xFAmelo" --file <id>'],
11412
+ summary: "Your account: files, memories and usage.",
11413
+ usage: ["ghosty me files ls [--q TEXT] [--kind image|video|audio|document|other] [--cursor C]", "ghosty me files get <file-id> [--out FILE]", "ghosty me files upload <file> | rm <file-id>", 'ghosty me memories ls [--agent A] | add "text" [--agent A] | edit <id> "text" | rm <id>', "ghosty usage"],
11414
+ examples: ["ghosty me files ls --kind document", "ghosty me files ls --q contrato", "ghosty me files get <id> --out contrato.pdf", 'ghosty chat <agent> "res\xFAmelo" --file <id>', 'ghosty me memories add "I prefer short answers"'],
11415
+ notes: ["Memories travel to your agents only in your personal chats (app, /c, notch), never to WhatsApp, Messenger or demo threads. --agent limits one to that agent."],
11372
11416
  learn: `${REF}#tu-cuenta`
11373
11417
  }
11374
11418
  };
@@ -11626,14 +11670,14 @@ HELPS.novedades = {
11626
11670
  summary: "Ghosty staff: the Android app's announcements (what's new). Each one needs its own illustration; same brakes as the admin: test on your phone first, push 9\u201321 h CDMX, 72 h between pushes to everyone.",
11627
11671
  usage: [
11628
11672
  "ghosty novedades ls",
11629
- 'ghosty novedades create --title T --body B --image hero.png [--link ruta] [--button "Abrir"] [--to a@x.com,b@y.com] [--publish]',
11630
- "ghosty novedades set <id> [--title] [--body] [--image FILE] [--link] [--button] [--to] [--publish|--draft]",
11673
+ 'ghosty novedades create --title T --body B --image hero.png [--link ruta] [--button "Abrir"] [--to a@x.com,b@y.com] [--min-version N] [--publish]',
11674
+ "ghosty novedades set <id> [--title] [--body] [--image FILE] [--link] [--button] [--to] [--min-version N] [--publish|--draft]",
11631
11675
  "ghosty novedades test <id>",
11632
11676
  'ghosty novedades send <id> [--at "2026-10-02T12:00"]',
11633
11677
  "ghosty novedades rm <id>"
11634
11678
  ],
11635
11679
  examples: ['ghosty novedades create --title "PDF y audio" --body "Ahora\u2026" --image hero.png --link chats --publish', "ghosty novedades test <id>", 'ghosty novedades send <id> --at "2026-10-02T12:00"'],
11636
- notes: ["--image is published to img.ghosty.studio (WebP 1200 px). --to empty = everyone. send without --at pushes now (asks); --at '' removes the schedule."],
11680
+ notes: ["--image is published to img.ghosty.studio (WebP 1200 px). --to empty = everyone. send without --at pushes now (asks); --at '' removes the schedule.", "--min-version N (Android versionCode): if the tester's app is older, the button reads \xABActualizar\xBB and starts Play's in-app update; '' removes it."],
11637
11681
  learn: `${REF}#soporte`
11638
11682
  };
11639
11683
  HELPS.spaces = {
@@ -12407,6 +12451,7 @@ async function turnStats(v) {
12407
12451
  dim(Object.entries(r.byState).map(([k, n]) => `${k} ${n}`).join(" \xB7 ")),
12408
12452
  "",
12409
12453
  table(r.byEngine.map((e) => ({ engine: e.engine, turns: e.turns, failed: e.failed, rate: `${e.failRate}%` })), ["engine", "turns", "failed", "rate"]),
12454
+ ...r.byCanal?.length ? ["", table(r.byCanal.map((c) => ({ canal: c.canal, turns: c.turns, failed: c.failed, rate: `${c.failRate}%` })), ["canal", "turns", "failed", "rate"])] : [],
12410
12455
  ...r.topErrors.length ? ["", table(r.topErrors.map((e) => ({ n: e.n, error: e.error })), ["n", "error"])] : []
12411
12456
  ].join("\n")
12412
12457
  );
@@ -12432,7 +12477,7 @@ ${table(rows, ["at", "kind", "to", "status", "thread", "title", "detail"])}` : d
12432
12477
  }
12433
12478
  async function novedadesCmd(sub, id, v) {
12434
12479
  const base = "/api/v2/support/announcements";
12435
- const ex = 'ghosty novedades ls \xB7 create --title T --body B --image hero.png [--link ruta] [--button "Abrir"] [--to a@x.com,b@y.com] [--publish] \xB7 set <id> \u2026 \xB7 test <id> \xB7 send <id> [--at "2026-10-02T12:00"] \xB7 rm <id>';
12480
+ const ex = 'ghosty novedades ls \xB7 create --title T --body B --image hero.png [--link ruta] [--button "Abrir"] [--to a@x.com,b@y.com] [--min-version 12] [--publish] \xB7 set <id> \u2026 \xB7 test <id> \xB7 send <id> [--at "2026-10-02T12:00"] \xB7 rm <id>';
12436
12481
  const fields = async () => ({
12437
12482
  ...v.title !== void 0 ? { title: v.title } : {},
12438
12483
  ...v.body !== void 0 ? { body: v.body } : {},
@@ -12440,10 +12485,12 @@ async function novedadesCmd(sub, id, v) {
12440
12485
  ...v.link !== void 0 ? { enlace: v.link || null } : {},
12441
12486
  ...v.button !== void 0 ? { boton: v.button || null } : {},
12442
12487
  ...v.to !== void 0 ? { destinatarios: v.to || null } : {},
12488
+ // «Requiere versión ≥ N» (versionCode de Android): el botón dice «Actualizar». Vacío = la quita.
12489
+ ...v["min-version"] !== void 0 ? { minVersionCode: v["min-version"] ? Number(v["min-version"]) : null } : {},
12443
12490
  ...v.publish ? { published: true } : v.draft ? { published: false } : {}
12444
12491
  });
12445
12492
  const line2 = (a) => `${bold(a.title)} ${dim(a.id)}
12446
- ${a.published ? lavender(t("published", "publicada")) : dim(t("draft", "borrador"))} \xB7 ${a.pushedAt ? t(`pushed ${cdmx(a.pushedAt)} (${a.pushCount})`, `enviada ${cdmx(a.pushedAt)} (${a.pushCount})`) : a.schedule ? t(`push scheduled ${cdmx(a.schedule)} CDMX`, `push programado ${cdmx(a.schedule)} CDMX`) : t("not pushed", "sin enviar")} \xB7 ${a.destinatarios ? t(`to ${a.destinatarios.split(",").length}`, `para ${a.destinatarios.split(",").length}`) : t("everyone", "todos")}`;
12493
+ ${a.published ? lavender(t("published", "publicada")) : dim(t("draft", "borrador"))} \xB7 ${a.pushedAt ? t(`pushed ${cdmx(a.pushedAt)} (${a.pushCount})`, `enviada ${cdmx(a.pushedAt)} (${a.pushCount})`) : a.schedule ? t(`push scheduled ${cdmx(a.schedule)} CDMX`, `push programado ${cdmx(a.schedule)} CDMX`) : t("not pushed", "sin enviar")} \xB7 ${a.destinatarios ? t(`to ${a.destinatarios.split(",").length}`, `para ${a.destinatarios.split(",").length}`) : t("everyone", "todos")}${a.minVersionCode ? t(` \xB7 needs v${a.minVersionCode}+`, ` \xB7 requiere v${a.minVersionCode}+`) : ""}`;
12447
12494
  switch (sub ?? "ls") {
12448
12495
  case "ls":
12449
12496
  case "list": {
@@ -12575,7 +12622,7 @@ ${bold("Support")} ${dim("(Ghosty staff)")}
12575
12622
  conversations show <id> <conv> --why A conversation: who sees it in their list / by link, and why
12576
12623
  turns stats Real failure rate by engine and error [--since 14d] [--all]
12577
12624
  push log --user EMAIL Pushes sent to someone and what Apple/Google answered [--since 2d]
12578
- novedades ls|create|set|test|send|rm Android app announcements [--title] [--body] [--image FILE] [--link] [--to] [--publish] [--at]
12625
+ novedades ls|create|set|test|send|rm Android app announcements [--title] [--body] [--image FILE] [--link] [--to] [--min-version N] [--publish] [--at]
12579
12626
 
12580
12627
  ${bold("Demos")}
12581
12628
  demos try <slug> "msg" ["msg2"\u2026] Try a public demo as a visitor (same thread across runs) [--new] [--recycle-between --agent X]
@@ -12605,6 +12652,7 @@ ${bold("Partners")} ${dim("(give an agent to each of YOUR customers \u2014 see:
12605
12652
 
12606
12653
  ${bold("Your account")}
12607
12654
  me files ls|get|upload|rm Files in your account [--q TEXT] [--kind image|video|audio|document|other] [--cursor C] \xB7 get <id> [--out FILE]
12655
+ me memories ls|add|edit|rm What your agents remember about you (personal chats only) [--agent A] \xB7 add "text" \xB7 edit <id> "text" \xB7 rm <id>
12608
12656
  credentials ls|set|rm [provider] Provider keys in your vault (hidden prompt, stdin or --from-env VAR; never as an argument)
12609
12657
  docs [topic] Open the docs
12610
12658
 
@@ -12702,7 +12750,7 @@ ${bold("Soporte")} ${dim("(staff de Ghosty)")}
12702
12750
  conversations show <id> <conv> --why Una conversaci\xF3n: qui\xE9n la ve en su lista / por liga, y por qu\xE9
12703
12751
  turns stats Tasa real de fallos por motor y por error [--since 14d] [--all]
12704
12752
  push log --user CORREO Avisos que se le mandaron a alguien y qu\xE9 contest\xF3 Apple/Google [--since 2d]
12705
- novedades ls|create|set|test|send|rm Novedades de la app Android [--title] [--body] [--image ARCHIVO] [--link] [--to] [--publish] [--at]
12753
+ novedades ls|create|set|test|send|rm Novedades de la app Android [--title] [--body] [--image ARCHIVO] [--link] [--to] [--min-version N] [--publish] [--at]
12706
12754
 
12707
12755
  ${bold("Demos")}
12708
12756
  demos try <slug> "msg" ["msg2"\u2026] Prueba un demo p\xFAblico como visitante (mismo hilo entre corridas) [--new] [--recycle-between --agent X]
@@ -12732,6 +12780,7 @@ ${bold("Partners")} ${dim("(dale un agente a cada uno de TUS clientes \u2014 ve
12732
12780
 
12733
12781
  ${bold("Tu cuenta")}
12734
12782
  me files ls|get|upload|rm Archivos de tu cuenta [--q TEXTO] [--kind image|video|audio|document|other] [--cursor C] \xB7 get <id> [--out ARCHIVO]
12783
+ me memories ls|add|edit|rm Lo que tus agentes recuerdan de ti (s\xF3lo chats personales) [--agent A] \xB7 add "texto" \xB7 edit <id> "texto" \xB7 rm <id>
12735
12784
  credentials ls|set|rm [proveedor] Llaves de proveedor en tu b\xF3veda (prompt oculto, stdin o --from-env VAR; nunca como argumento)
12736
12785
  docs [tema] Abre la documentaci\xF3n
12737
12786
 
@@ -12928,6 +12977,7 @@ async function main() {
12928
12977
  image: { type: "string" },
12929
12978
  link: { type: "string" },
12930
12979
  button: { type: "string" },
12980
+ "min-version": { type: "string" },
12931
12981
  publish: { type: "boolean" },
12932
12982
  draft: { type: "boolean" },
12933
12983
  "ads-only": { type: "string" },
@@ -12952,7 +13002,7 @@ async function main() {
12952
13002
  const tokens = splitTokens(pos, v);
12953
13003
  globals.token = tokens.session;
12954
13004
  globals.profile = v.profile;
12955
- if (v.version) return out({ version: "0.31.0" }, () => "0.31.0");
13005
+ if (v.version) return out({ version: "0.32.0" }, () => "0.32.0");
12956
13006
  for (const n of normalizeArgs(pos, v)) if (!globals.json) info(dim(n));
12957
13007
  const context = (await readConfig()).workspace;
12958
13008
  if (!explicitToken()?.startsWith("gat_")) {
@@ -13085,8 +13135,9 @@ async function main() {
13085
13135
  return planCmd(sub, a1, v, context);
13086
13136
  case "me":
13087
13137
  if (sub === "files") return meFiles(a1, a2, v);
13138
+ if (sub === "memories" || sub === "memory") return meMemories(a1, a2, pos[4], v);
13088
13139
  if (sub === "usage") return meUsage();
13089
- throw usage(t(`Unknown me subcommand: ${sub ?? "(none)"}.`, `Subcomando de me desconocido: ${sub ?? "(ninguno)"}.`), t("Try: ghosty me files ls", "Prueba: ghosty me files ls"));
13140
+ throw usage(t(`Unknown me subcommand: ${sub ?? "(none)"}.`, `Subcomando de me desconocido: ${sub ?? "(ninguno)"}.`), t("Try: ghosty me files ls | ghosty me memories ls", "Prueba: ghosty me files ls | ghosty me memories ls"));
13090
13141
  case "docs": {
13091
13142
  const url = `${await baseUrl()}/docs${sub ? `/${encodeURIComponent(sub)}` : "/cli"}`;
13092
13143
  if (globals.json) return out({ url });
@@ -13097,7 +13148,7 @@ async function main() {
13097
13148
  throw unknown(cmd, cmd, COMMANDS, "ghosty --help");
13098
13149
  }
13099
13150
  }
13100
- var notice = updateNotice("0.31.0").catch(() => null);
13151
+ var notice = updateNotice("0.32.0").catch(() => null);
13101
13152
  main().then(
13102
13153
  async () => {
13103
13154
  const n = await notice;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ghostystudio/cli",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "description": "Official Ghosty Studio CLI — configure, test and chat with your agents from the terminal. Built for humans and coding agents.",
5
5
  "type": "module",
6
6
  "bin": {