@audiofool/moondog 0.2.0-beta.7 → 0.2.1
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 +4 -3
- package/package.json +1 -1
- package/scripts/moondog.mjs +30 -6
- package/src/core/application-update.mjs +30 -18
- package/src/core/first-run.mjs +53 -0
- package/src/i18n/screen/es.mjs +62 -4
- package/src/i18n/screen/ja.mjs +62 -4
- package/src/i18n/screen/pt.mjs +62 -4
- package/src/i18n/screen/zh.mjs +62 -4
- package/src/integrations/netease/ncm-cli-player.mjs +29 -13
- package/src/memory/reflection-worker.mjs +1 -1
- package/src/runtime/pi/authentication.mjs +31 -10
- package/src/runtime/pi/configured-runtime.mjs +3 -3
- package/src/runtime/pi/custom-endpoints.mjs +229 -0
- package/src/runtime/pi/model-catalog.mjs +7 -3
- package/src/runtime/pi/model-list.mjs +122 -0
- package/src/runtime/pi/model-settings.mjs +131 -20
- package/src/runtime/pi/model-transport.mjs +2 -2
- package/src/runtime/pi/persistent-credential-store.mjs +31 -0
- package/src/runtime/pi/provider-registry.mjs +3 -9
- package/src/runtime/pi/public-model-catalog.mjs +12 -4
- package/src/runtime/pi/runtime-selection.mjs +9 -0
- package/src/runtime/pi/runtime-settings.mjs +37 -0
- package/src/surfaces/cli/auth-command.mjs +25 -56
- package/src/surfaces/cli/brand-components.mjs +1 -1
- package/src/surfaces/cli/command-completions.mjs +14 -0
- package/src/surfaces/cli/endpoint-command.mjs +106 -0
- package/src/surfaces/cli/first-run-view.mjs +138 -0
- package/src/surfaces/cli/format-output.mjs +1 -1
- package/src/surfaces/cli/tui.mjs +320 -33
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<h1 align="center">Moondog</h1>
|
|
6
6
|
|
|
7
|
-
<p align="center">
|
|
7
|
+
<p align="center">Version 0.2.1</p>
|
|
8
8
|
|
|
9
9
|
<p align="center"><strong>A listening room that shows its work.</strong></p>
|
|
10
10
|
|
|
@@ -33,7 +33,7 @@ npm ci
|
|
|
33
33
|
npm start
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
[@audiofool/moondog](https://www.npmjs.com/package/@audiofool/moondog) 0.
|
|
36
|
+
[@audiofool/moondog](https://www.npmjs.com/package/@audiofool/moondog) 0.2.0 is the published package; `npm install --global @audiofool/moondog` installs it.
|
|
37
37
|
To see the agent work through fictional data, with no sign-in at all, run `npm run demo` from the checkout.
|
|
38
38
|
|
|
39
39
|
The source version supports `moondog update` and `/update`, with stable (`latest`) and preview (`beta`) channels.
|
|
@@ -143,7 +143,8 @@ You can save that report as a private page that works offline.
|
|
|
143
143
|
|
|
144
144
|
Sign in with `/auth`, then pick a model with `/model`.
|
|
145
145
|
GLM, Kimi, DeepSeek, Grok, GPT, Claude, Gemini, and OpenRouter are there.
|
|
146
|
-
|
|
146
|
+
OpenAI takes your ChatGPT subscription or an API key.
|
|
147
|
+
In the Mac app, any service that speaks OpenAI's or Anthropic's API can be added as an endpoint by its address, and `/endpoint` does it in the terminal.
|
|
147
148
|
You can switch models in the middle of a conversation.
|
|
148
149
|
The [model setup guide](docs/TERMINAL_GUIDE.md#enable-agent-conversation) lists each provider and the environment variable it reads.
|
|
149
150
|
|
package/package.json
CHANGED
package/scripts/moondog.mjs
CHANGED
|
@@ -17,7 +17,7 @@ import { runMemoryReflection } from "../src/memory/reflection-worker.mjs";
|
|
|
17
17
|
import { createConfiguredRuntime } from "../src/runtime/pi/configured-runtime.mjs";
|
|
18
18
|
import { createModelSettings } from "../src/runtime/pi/model-settings.mjs";
|
|
19
19
|
import { createToolTrace } from "../src/runtime/pi/tool-trace.mjs";
|
|
20
|
-
import { writePiRuntimeSelection } from "../src/runtime/pi/runtime-settings.mjs";
|
|
20
|
+
import { watchRuntimeSettings, writePiRuntimeSelection } from "../src/runtime/pi/runtime-settings.mjs";
|
|
21
21
|
import {
|
|
22
22
|
formatLocalResult,
|
|
23
23
|
formatDemoResult,
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
sanitizeTerminalText,
|
|
27
27
|
} from "../src/surfaces/cli/format-output.mjs";
|
|
28
28
|
import { runAuthCommand } from "../src/surfaces/cli/auth-command.mjs";
|
|
29
|
+
import { runEndpointCommand } from "../src/surfaces/cli/endpoint-command.mjs";
|
|
29
30
|
import { runDataCommand } from "../src/surfaces/cli/data-command.mjs";
|
|
30
31
|
import { runCatalogCommand } from "../src/surfaces/cli/catalog-command.mjs";
|
|
31
32
|
import { runProfileCommand } from "../src/surfaces/cli/profile-command.mjs";
|
|
@@ -69,6 +70,7 @@ import {
|
|
|
69
70
|
import { deriveArtistReleaseHintsFromSpotifyArchive } from "../src/profile/spotify-archive-catalog-hints.mjs";
|
|
70
71
|
import { resolveListenerLocale, writeLanguagePreference } from "../src/i18n/preferences.mjs";
|
|
71
72
|
import { createPlaybackSelection, resolvePlaybackService, watchPlaybackPreference, writePlaybackPreference } from "../src/core/playback-preferences.mjs";
|
|
73
|
+
import { createFirstRun } from "../src/core/first-run.mjs";
|
|
72
74
|
|
|
73
75
|
const localCommands = new Set([
|
|
74
76
|
"status",
|
|
@@ -664,6 +666,11 @@ async function main() {
|
|
|
664
666
|
return;
|
|
665
667
|
}
|
|
666
668
|
|
|
669
|
+
if (options.command === "endpoint") {
|
|
670
|
+
await runEndpointCommand({ args: options.rest, json: options.json });
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
|
|
667
674
|
if (options.command === "spotify") {
|
|
668
675
|
await runSpotifySurface({
|
|
669
676
|
args: options.rest,
|
|
@@ -1071,28 +1078,45 @@ async function main() {
|
|
|
1071
1078
|
if (receipt?.provider === "apple-music-library") await refreshAppleLibraryImport();
|
|
1072
1079
|
replaceDomainServices(await loadDomainServices());
|
|
1073
1080
|
},
|
|
1074
|
-
// The window also rebuilds the agent of each conversation it opened.
|
|
1075
|
-
//
|
|
1081
|
+
// The window also rebuilds the agent of each conversation it opened. Only a new default is saved;
|
|
1082
|
+
// a model chosen for one conversation is built without touching settings.json.
|
|
1076
1083
|
saveRuntimeSelection: (selection) => writePiRuntimeSelection(selection),
|
|
1077
1084
|
rebuildRuntime: async (selection, target = application) => {
|
|
1078
|
-
if (selection) await writePiRuntimeSelection(selection);
|
|
1079
1085
|
// A key saved with /auth, or a Codex sign-in since, takes effect with the new runtime's tools.
|
|
1080
1086
|
await webResearch.refresh();
|
|
1081
1087
|
return createConfiguredRuntime(target, process.env, { selection, toolTrace });
|
|
1082
1088
|
},
|
|
1083
1089
|
// The desktop window lists models and signs in here, with no terminal.
|
|
1084
1090
|
modelSettings: createModelSettings({ environment: process.env }),
|
|
1091
|
+
// A model chosen or a sign-in made on the other surface. Model variables fix the model at
|
|
1092
|
+
// launch, so a saved choice has nothing to change then.
|
|
1093
|
+
watchModelSettings: (onChange) => (process.env.MOONDOG_PROVIDER !== undefined || process.env.MOONDOG_MODEL !== undefined
|
|
1094
|
+
? () => {}
|
|
1095
|
+
: watchRuntimeSettings({ environment: process.env, onChange })),
|
|
1096
|
+
// The one-time music service and model setup, shared by the terminal and the window.
|
|
1097
|
+
firstRun: createFirstRun({ environment: process.env }),
|
|
1085
1098
|
// A host with its own terminal streams takes the sign-in prompts. The
|
|
1086
1099
|
// desktop window has none and uses modelSettings instead.
|
|
1087
|
-
runAuth: (provider) =>
|
|
1100
|
+
runAuth: (provider, { chatgpt = false } = {}) =>
|
|
1088
1101
|
runAuthCommand({
|
|
1089
|
-
args: ["login", provider],
|
|
1102
|
+
args: ["login", provider, ...(chatgpt ? ["--chatgpt"] : [])],
|
|
1090
1103
|
...(host?.terminalStreams && {
|
|
1091
1104
|
input: host.terminalStreams.input,
|
|
1092
1105
|
output: host.terminalStreams.output,
|
|
1093
1106
|
progressOutput: host.terminalStreams.output,
|
|
1094
1107
|
}),
|
|
1095
1108
|
}),
|
|
1109
|
+
// The terminal adds an endpoint on its own streams, as it signs in; a list or removal prints nothing.
|
|
1110
|
+
runEndpoint: (args, { quiet = false } = {}) =>
|
|
1111
|
+
runEndpointCommand({
|
|
1112
|
+
args,
|
|
1113
|
+
...(quiet ? { output: { write() {} } } : {}),
|
|
1114
|
+
...(host?.terminalStreams && {
|
|
1115
|
+
input: host.terminalStreams.input,
|
|
1116
|
+
...(quiet ? {} : { output: host.terminalStreams.output }),
|
|
1117
|
+
progressOutput: host.terminalStreams.output,
|
|
1118
|
+
}),
|
|
1119
|
+
}),
|
|
1096
1120
|
runWeb: (args, options) => runWebCommand({ args, webResearch, ...options }),
|
|
1097
1121
|
runProfileAction: (args) => runProfileCommand({
|
|
1098
1122
|
args,
|
|
@@ -5,7 +5,9 @@ import { access, lstat, mkdir, mkdtemp, readFile, readlink, realpath, rename, rm
|
|
|
5
5
|
import { constants, realpathSync } from "node:fs";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
-
|
|
8
|
+
// The release workflow checks a tag with scripts/release-version.mjs before npm ci, so this module and
|
|
9
|
+
// what it imports load no npm package. settings.json lives beside auth.json.
|
|
10
|
+
import { resolveMoondogAuthFile } from "../runtime/pi/persistent-credential-store.mjs";
|
|
9
11
|
import { resolveMoondogStateDirectory } from "./state-directory.mjs";
|
|
10
12
|
|
|
11
13
|
const exec = promisify(execFile);
|
|
@@ -88,7 +90,7 @@ export async function activeInstallationProcesses(root, { run = command, ownPid
|
|
|
88
90
|
export function createApplicationUpdater({ root = DEFAULT_ROOT, environment = process.env, fetchImpl = globalThis.fetch,
|
|
89
91
|
run = command, now = Date.now, activeProcesses, node = process.execPath, npm = "npm" } = {}) {
|
|
90
92
|
root = realpathSync(path.resolve(root));
|
|
91
|
-
const storage = path.join(path.dirname(
|
|
93
|
+
const storage = path.join(path.dirname(resolveMoondogAuthFile(environment)), "updates");
|
|
92
94
|
// Installation-wide, even when two sessions use different config homes.
|
|
93
95
|
const lock = path.join(path.dirname(root), ".moondog-update-" + createHash("sha256").update(root).digest("hex").slice(0, 24) + ".lock");
|
|
94
96
|
const recovery = lock + ".recovery.json";
|
|
@@ -103,7 +105,7 @@ export function createApplicationUpdater({ root = DEFAULT_ROOT, environment = pr
|
|
|
103
105
|
async function assertDataOutsideReplacement(mode) {
|
|
104
106
|
const replaced = mode === "npm" ? root : path.join(root, "node_modules");
|
|
105
107
|
const canonical = await resolvedPath(replaced);
|
|
106
|
-
const personal = [path.dirname(
|
|
108
|
+
const personal = [path.dirname(resolveMoondogAuthFile(environment)), resolveMoondogStateDirectory(environment),
|
|
107
109
|
environment.MOONDOG_APPLE_IMPORTS_ROOT, environment.MOONDOG_APPLE_PROJECTION_PATH].filter(Boolean);
|
|
108
110
|
for (const file of personal) {
|
|
109
111
|
if (inside(replaced, path.resolve(file)) || inside(canonical, await resolvedPath(path.resolve(file)))) {
|
|
@@ -149,21 +151,31 @@ export function createApplicationUpdater({ root = DEFAULT_ROOT, environment = pr
|
|
|
149
151
|
let result;
|
|
150
152
|
try {
|
|
151
153
|
const controller = AbortSignal.timeout(5_000);
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
154
|
+
const fetchChannel = async candidate => {
|
|
155
|
+
const response = await fetchImpl(`https://registry.npmjs.org/@audiofool%2fmoondog/${candidate}`, {
|
|
156
|
+
signal: signal ? AbortSignal.any([signal, controller]) : controller,
|
|
157
|
+
redirect: "error", headers: { Accept: "application/json" },
|
|
158
|
+
});
|
|
159
|
+
if (response.status === 404) throw failure("update_channel_empty", `No ${candidate} release has been published yet.`);
|
|
160
|
+
if (!response.ok) throw new Error("Registry unavailable");
|
|
161
|
+
const release = JSON.parse((await boundedBody(response, 512_000)).toString("utf8"));
|
|
162
|
+
if (release.name !== UPDATE_PACKAGE || !releaseVersion(release.version) ||
|
|
163
|
+
candidate === "latest" && release.version.includes("-") ||
|
|
164
|
+
![`${REPOSITORY}.git`, `git+${REPOSITORY}.git`].includes(release.repository?.url)) throw new Error("Invalid release metadata");
|
|
165
|
+
const minimum = release.engines?.node?.match(/^>=(\d+\.\d+\.\d+)$/u)?.[1];
|
|
166
|
+
if (!minimum || !releaseVersion(minimum)) throw new Error("Unsupported runtime requirement");
|
|
167
|
+
const tarball = `https://registry.npmjs.org/@audiofool/moondog/-/moondog-${release.version}.tgz`;
|
|
168
|
+
if (release.dist?.tarball !== tarball || !/^sha512-[A-Za-z0-9+/]{86}==$/u.test(release.dist?.integrity ?? "")) throw new Error("Unsupported package integrity metadata");
|
|
169
|
+
return { release, minimum, tarball };
|
|
170
|
+
};
|
|
171
|
+
// Preview users receive the stable successor without changing their saved beta preference.
|
|
172
|
+
// One unavailable channel must not hide a valid release from the other channel.
|
|
173
|
+
const checks = await Promise.allSettled((channel === "beta" ? ["beta", "latest"] : ["latest"]).map(fetchChannel));
|
|
174
|
+
const candidates = checks.filter(check => check.status === "fulfilled").map(check => check.value)
|
|
175
|
+
.sort((a, b) => compareReleaseVersions(b.release.version, a.release.version));
|
|
176
|
+
if (!candidates.length) throw checks[0].reason;
|
|
177
|
+
signal?.throwIfAborted();
|
|
178
|
+
const { release, minimum, tarball } = candidates[0];
|
|
167
179
|
result = { state: compareReleaseVersions(release.version, current.version) > 0 ? "available" : "current", current: current.version,
|
|
168
180
|
latest: release.version, channel, minimumNode: minimum,
|
|
169
181
|
compatible: compareReleaseVersions(process.versions.node, minimum) >= 0,
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { unwatchFile, watchFile } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
import { readPlaybackPreference, resolvePlaybackPreferenceFile } from "./playback-preferences.mjs";
|
|
6
|
+
import { resolveMoondogAuthFile } from "../runtime/pi/persistent-credential-store.mjs";
|
|
7
|
+
|
|
8
|
+
// The first launch asks for a music service and a model, once, on whichever surface opens first.
|
|
9
|
+
// first-run.json, kept beside playback.json, says the first run is over, so the terminal and the
|
|
10
|
+
// window ask once between them. It ends when the listener skips it, or once a music service is
|
|
11
|
+
// saved and a model can answer; signing out later does not bring it back.
|
|
12
|
+
export function resolveFirstRunFile(environment = process.env) {
|
|
13
|
+
return path.join(path.dirname(resolveMoondogAuthFile(environment)), "first-run.json");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function readFinished(environment) {
|
|
17
|
+
try {
|
|
18
|
+
const document = JSON.parse(await readFile(resolveFirstRunFile(environment), "utf8"));
|
|
19
|
+
return document?.version === 1 && typeof document.finished_at === "string";
|
|
20
|
+
} catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function writeFinished(environment, { skipped }) {
|
|
26
|
+
const file = resolveFirstRunFile(environment);
|
|
27
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
28
|
+
const document = { version: 1, finished_at: new Date().toISOString(), skipped: skipped === true };
|
|
29
|
+
await writeFile(file, `${JSON.stringify(document, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function createFirstRun({ environment = process.env, interval = 2000 } = {}) {
|
|
33
|
+
return {
|
|
34
|
+
// What the first run still asks for. A service counts once it is saved, even as Spotify, the
|
|
35
|
+
// default; the model counts once the surface's own agent can answer (modelReady).
|
|
36
|
+
async state({ modelReady = false } = {}) {
|
|
37
|
+
const [finished, service] = await Promise.all([readFinished(environment), readPlaybackPreference(environment)]);
|
|
38
|
+
const over = finished || Boolean(service && modelReady);
|
|
39
|
+
if (over && !finished) await writeFinished(environment, { skipped: false }).catch(() => {});
|
|
40
|
+
return { needed: !over, service, model: modelReady === true };
|
|
41
|
+
},
|
|
42
|
+
// The listener skipped the rest, or the surface's last step ended it.
|
|
43
|
+
finish: ({ skipped = false } = {}) => writeFinished(environment, { skipped }),
|
|
44
|
+
// Hears a save on either side: the first run ended there, or a music service was chosen. A model
|
|
45
|
+
// reaches the surface through its own agent, which watchRuntimeSettings rebuilds.
|
|
46
|
+
watch(listener) {
|
|
47
|
+
const files = [resolveFirstRunFile(environment), resolvePlaybackPreferenceFile(environment)];
|
|
48
|
+
const changed = (now, before) => { if (now.mtimeMs !== before.mtimeMs) listener(); };
|
|
49
|
+
for (const file of files) watchFile(file, { interval, persistent: false }, changed);
|
|
50
|
+
return () => { for (const file of files) unwatchFile(file, changed); };
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
package/src/i18n/screen/es.mjs
CHANGED
|
@@ -22,7 +22,7 @@ export default {
|
|
|
22
22
|
"What have you been listening to?": "¿Qué has estado escuchando?",
|
|
23
23
|
"A song, a playlist, or what to play next.": "Una canción, una playlist o qué poner después.",
|
|
24
24
|
"Your personal music agent.": "Tu agente musical personal.",
|
|
25
|
-
"# Your listening room\n\n## 01 / Listen and discover\n\nJust type to talk about music, ask for a playlist, or go exploring.\nTo talk, Moondog needs a model: `/auth` signs you in, then `/model` picks one.\nWhile an answer is coming, each step shows in the conversation, and the footer names the one in progress.\n\n- `/taste` - your profile: open any song or artist to see why it's there\n- `/taste report` - the whole picture on one page\n- `/import` - bring in your history, your library, or a playlist\n- `/lyrics` - the lyrics on the sleeve; `/lyrics sync` finds more\n- `/spotify` - play, queue, and make playlists in Spotify\n- Ask to move playback onto your iPhone, computer, or another Spotify device by name\n- `/web search <query>` or `/web read <url>` - look things up on public music sites\n\n## 02 / Make it yours\n\n- `/profile` - the same profile as `/taste`\n- `/profile corrections` - everything you've told me\n- `/profile retract <id>` - undo one of those\n- `/profile help` - the full set of profile commands\n- `/remember <text>`, `/memory`, `/forget <id>` - what I remember between conversations\n\n## 03 / Around the room\n\n- `/home` - back to the record sleeve; the conversation stays\n- `/theme paper|charcoal|terminal|auto` - change the look\n- `/art braille|ascii|off` - change the artwork\n- `/motion on|off` - turn the animation on or off\n- `/commands` or Ctrl+P - search every command; your message stays put\n- Page Up and Page Down scroll the conversation. The header and your draft stay put\n- Up and Down in the draft recall what you typed in this conversation\n- `/resume` - pick up a saved conversation (type to filter, Enter opens)\n- `/new` - start fresh; this conversation stays saved\n- `/status`, `/sources`, `/tools`, `/doctor` - see what's connected and working\n- `/reload` - reload model settings and sign-ins\n- `/update [--check] [--channel latest|beta]` - check for a release, or close this room and install it\n- `/help all` - every command, including the ones for the shell\n- `/language` - choose the language Moondog uses\n- `/quit` - leave\n\nTab moves to the menu on the home screen. Esc goes back to typing.\nEnter sends, and Shift+Enter starts a new line.\nTab or Enter accepts a suggestion.\nCtrl+C stops a model or web request, or leaves when nothing is running.\nIn the profile, type to filter, Tab switches lists, and Enter shows what you can do.\nCtrl+R refreshes it and Ctrl+O opens the full report.\nYour profile works without a model.\nPut quotes around paths, titles, and names that have spaces.": "# Tu sala de escucha\n\n## 01 / Escucha y descubre\n\nEscribe para hablar de música, pedir una playlist o explorar.\nPara hablar, Moondog necesita un modelo: `/auth` inicia sesión y `/model` elige uno.\nMientras llega una respuesta, cada paso aparece en la conversación y el pie de página indica el que está en curso.\n\n- `/taste` - tu perfil: abre cualquier canción o artista para ver por qué está ahí\n- `/taste report` - el panorama completo en una página\n- `/import` - trae tu historial, tu biblioteca o una playlist\n- `/lyrics` - la letra de la portada; `/lyrics sync` busca más\n- `/spotify` - reproduce, añade a la cola y crea playlists en Spotify\n- Pide pasar la reproducción a tu iPhone, tu ordenador u otro dispositivo de Spotify por su nombre\n- `/web search <búsqueda>` o `/web read <url>` - consulta sitios de música públicos\n\n## 02 / Hazlo tuyo\n\n- `/profile` - el mismo perfil que `/taste`\n- `/profile corrections` - todo lo que me has dicho\n- `/profile retract <id>` - deshaz una de esas elecciones\n- `/profile help` - todos los comandos del perfil\n- `/remember <texto>`, `/memory`, `/forget <id>` - lo que recuerdo entre conversaciones\n\n## 03 / Por la sala\n\n- `/home` - vuelve a la portada; la conversación se queda\n- `/theme paper|charcoal|terminal|auto` - cambia el aspecto\n- `/art braille|ascii|off` - cambia la ilustración\n- `/motion on|off` - activa o desactiva la animación\n- `/commands` o Ctrl+P - busca cualquier comando; tu mensaje no se pierde\n- Re Pág y Av Pág desplazan la conversación. La cabecera y tu borrador no se mueven\n- Arriba y Abajo en el borrador recuperan lo que escribiste en esta conversación\n- `/resume` - retoma una conversación guardada (escribe para filtrar, Enter la abre)\n- `/new` - empieza de cero; esta conversación queda guardada\n- `/status`, `/sources`, `/tools`, `/doctor` - mira qué está conectado y funcionando\n- `/reload` - recarga los ajustes del modelo y los inicios de sesión\n- `/update [--check] [--channel latest|beta]` - busca una versión nueva, o cierra esta sala e instálala\n- `/help all` - todos los comandos, incluidos los de la terminal\n- `/language` - elige el idioma de Moondog\n- `/quit` - salir\n\nTab lleva al menú de la pantalla de inicio. Esc vuelve a la escritura.\nEnter envía y Mayús+Enter empieza una línea nueva.\nTab o Enter aceptan una sugerencia.\nCtrl+C detiene una petición al modelo o a la web, o sale si no hay nada en marcha.\nEn el perfil, escribe para filtrar, Tab cambia de lista y Enter muestra lo que puedes hacer.\nCtrl+R lo actualiza y Ctrl+O abre el informe completo.\nTu perfil funciona sin modelo.\nPon entre comillas las rutas, títulos y nombres con espacios.",
|
|
25
|
+
"# Your listening room\n\n## 01 / Listen and discover\n\nJust type to talk about music, ask for a playlist, or go exploring.\nTo talk, Moondog needs a model: `/auth` signs you in, then `/model` picks one.\nWhile an answer is coming, each step shows in the conversation, and the footer names the one in progress.\n\n- `/taste` - your profile: open any song or artist to see why it's there\n- `/taste report` - the whole picture on one page\n- `/import` - bring in your history, your library, or a playlist\n- `/lyrics` - the lyrics on the sleeve; `/lyrics sync` finds more\n- `/service` - choose where I play music: Spotify, Apple Music, or NetEase\n- `/spotify` - play, queue, and make playlists in Spotify\n- Ask to move playback onto your iPhone, computer, or another Spotify device by name\n- `/web search <query>` or `/web read <url>` - look things up on public music sites\n\n## 02 / Make it yours\n\n- `/profile` - the same profile as `/taste`\n- `/profile corrections` - everything you've told me\n- `/profile retract <id>` - undo one of those\n- `/profile help` - the full set of profile commands\n- `/remember <text>`, `/memory`, `/forget <id>` - what I remember between conversations\n\n## 03 / Around the room\n\n- `/home` - back to the record sleeve; the conversation stays\n- `/theme paper|charcoal|terminal|auto` - change the look\n- `/art braille|ascii|off` - change the artwork\n- `/motion on|off` - turn the animation on or off\n- `/commands` or Ctrl+P - search every command; your message stays put\n- Page Up and Page Down scroll the conversation. The header and your draft stay put\n- Up and Down in the draft recall what you typed in this conversation\n- `/resume` - pick up a saved conversation (type to filter, Enter opens)\n- `/new` - start fresh; this conversation stays saved\n- `/status`, `/sources`, `/tools`, `/doctor` - see what's connected and working\n- `/reload` - reload model settings and sign-ins\n- `/update [--check] [--channel latest|beta]` - check for a release, or close this room and install it\n- `/help all` - every command, including the ones for the shell\n- `/language` - choose the language Moondog uses\n- `/quit` - leave\n\nTab moves to the menu on the home screen. Esc goes back to typing.\nEnter sends, and Shift+Enter starts a new line.\nTab or Enter accepts a suggestion.\nCtrl+C stops a model or web request, or leaves when nothing is running.\nIn the profile, type to filter, Tab switches lists, and Enter shows what you can do.\nCtrl+R refreshes it and Ctrl+O opens the full report.\nYour profile works without a model.\nPut quotes around paths, titles, and names that have spaces.": "# Tu sala de escucha\n\n## 01 / Escucha y descubre\n\nEscribe para hablar de música, pedir una playlist o explorar.\nPara hablar, Moondog necesita un modelo: `/auth` inicia sesión y `/model` elige uno.\nMientras llega una respuesta, cada paso aparece en la conversación y el pie de página indica el que está en curso.\n\n- `/taste` - tu perfil: abre cualquier canción o artista para ver por qué está ahí\n- `/taste report` - el panorama completo en una página\n- `/import` - trae tu historial, tu biblioteca o una playlist\n- `/lyrics` - la letra de la portada; `/lyrics sync` busca más\n- `/service` - elige dónde pongo la música: Spotify, Apple Music o NetEase\n- `/spotify` - reproduce, añade a la cola y crea playlists en Spotify\n- Pide pasar la reproducción a tu iPhone, tu ordenador u otro dispositivo de Spotify por su nombre\n- `/web search <búsqueda>` o `/web read <url>` - consulta sitios de música públicos\n\n## 02 / Hazlo tuyo\n\n- `/profile` - el mismo perfil que `/taste`\n- `/profile corrections` - todo lo que me has dicho\n- `/profile retract <id>` - deshaz una de esas elecciones\n- `/profile help` - todos los comandos del perfil\n- `/remember <texto>`, `/memory`, `/forget <id>` - lo que recuerdo entre conversaciones\n\n## 03 / Por la sala\n\n- `/home` - vuelve a la portada; la conversación se queda\n- `/theme paper|charcoal|terminal|auto` - cambia el aspecto\n- `/art braille|ascii|off` - cambia la ilustración\n- `/motion on|off` - activa o desactiva la animación\n- `/commands` o Ctrl+P - busca cualquier comando; tu mensaje no se pierde\n- Re Pág y Av Pág desplazan la conversación. La cabecera y tu borrador no se mueven\n- Arriba y Abajo en el borrador recuperan lo que escribiste en esta conversación\n- `/resume` - retoma una conversación guardada (escribe para filtrar, Enter la abre)\n- `/new` - empieza de cero; esta conversación queda guardada\n- `/status`, `/sources`, `/tools`, `/doctor` - mira qué está conectado y funcionando\n- `/reload` - recarga los ajustes del modelo y los inicios de sesión\n- `/update [--check] [--channel latest|beta]` - busca una versión nueva, o cierra esta sala e instálala\n- `/help all` - todos los comandos, incluidos los de la terminal\n- `/language` - elige el idioma de Moondog\n- `/quit` - salir\n\nTab lleva al menú de la pantalla de inicio. Esc vuelve a la escritura.\nEnter envía y Mayús+Enter empieza una línea nueva.\nTab o Enter aceptan una sugerencia.\nCtrl+C detiene una petición al modelo o a la web, o sale si no hay nada en marcha.\nEn el perfil, escribe para filtrar, Tab cambia de lista y Enter muestra lo que puedes hacer.\nCtrl+R lo actualiza y Ctrl+O abre el informe completo.\nTu perfil funciona sin modelo.\nPon entre comillas las rutas, títulos y nombres con espacios.",
|
|
26
26
|
"Listening profile": "Perfil de escucha",
|
|
27
27
|
"Profile": "Perfil",
|
|
28
28
|
"See what your listening reveals. Tell me what I missed.": "Mira lo que revela tu forma de escuchar. Dime qué se me escapó.",
|
|
@@ -176,7 +176,7 @@ export default {
|
|
|
176
176
|
"Memory": "Memoria",
|
|
177
177
|
"Right now I can't change anything in your music accounts.": "Ahora mismo no puedo cambiar nada en tus cuentas de música.",
|
|
178
178
|
"I can make changes in your connected accounts, and I always ask first.": "Puedo hacer cambios en tus cuentas conectadas, y siempre pregunto antes.",
|
|
179
|
-
"# Every command\n\nFrom your shell:\n\n- `moondog --version` - show the installed version\n- `moondog update [--check] [--channel latest|beta]` - check for or install a published release\n- `moondog web status|search|read [arguments] [--json]` - look things up on public music sites through DeepSeek, Brave Search or the Codex CLI\n- `moondog demo-history --output <absolute-file.zip> [--json]` - make a fictional Spotify history ZIP to try the importer with\n- `moondog auth login <provider>` - sign in to a model provider; the key is typed out of sight, and openai-codex uses your ChatGPT sign-in\n- `moondog auth status [provider]` - see which sign-ins are saved\n- `moondog auth logout <provider>` - sign out of a provider\n- `moondog spotify help` - set up and control Spotify\n- `moondog spotify login [client-id]` - connect Spotify in your browser\n- `moondog spotify now|devices|queue` - see what Spotify is playing, where, and what's next\n- `moondog spotify recent` - see what you played lately\n- `moondog spotify sync-recent` - add your latest plays to your profile\n- `moondog spotify sync-library` - add your Spotify library to your profile\n- `moondog spotify play|pause|next|previous` - control Spotify playback\n- `moondog listenbrainz import-history <listen-history.json>` - add a ListenBrainz listens file to your profile\n- `moondog catalog latest-single --artist <name> [--known-release <title> | --from <spotify-history.zip>]` - find an artist's latest single on Apple Music (US), no model needed\n- `moondog status [--json]` - see where things stand\n- `moondog taste [--json]` - your listening report\n- `moondog taste --html [--output <file.html>]` - save your report as a web page that works offline\n- `moondog taste --card [--output <file.html>]` - save a short recap you can check before sharing\n- `moondog taste --from <spotify-history.zip> --html` - a one-off report from a Spotify ZIP, without saving it\n- `moondog taste --from <account-data.zip> --from <extended-history.zip> --html` - a one-off report from both Spotify exports together\n- `moondog taste --from <spotify-history.zip> --save --html` - save the Spotify history, then show your full report\n- `moondog data inspect --scope <listening|apple|profile>` - see what's stored, and get the code needed to reset it\n- `moondog data export --scope <listening|apple|profile> --output <directory>` - export a copy, leaving the original alone\n- `moondog data reset --scope <listening|apple|profile> --confirm <token>` - set stored data aside (it is archived, not deleted)\n- `moondog profile build [--force]` - build or resume a saved profile with your connected model\n- `moondog profile saved [offset]` - read your saved profile\n- `moondog profile explain <number>` - trace a saved finding to its evidence\n- `moondog profile corrections [--all]` - everything you've told me, including earlier choices\n- `moondog profile correct --artist <name> (--like|--avoid)` - like an artist, or keep them out\n- `moondog profile correct --track <title> --by <artist> (--like|--avoid)` - like a track, or keep it out\n- `moondog profile retract <correction-id>` - undo one of your choices\n- `moondog demo --offline [--json]` - a demo with made-up data, no sign-in needed\n- `moondog demo [prompt] [--json]` - the same demo, talking through your model\n- `moondog ask <prompt>` - ask one question and exit\n- `moondog remember <text>` - ask me to remember something\n- `moondog forget <memory-id>` - forget something\n- `moondog memory reflect [--dry-run] [--json]` - let me think over recent conversations now\n- `moondog` - open the listening room\n\nInside the listening room:\n\n- `/update [--check] [--channel latest|beta]` - check for updates, or save and close this session to install one\n- `/status` or `/sources` - see where things stand\n- `/profile` or `/taste` - your profile, and why each song or artist is there\n- `/taste report` - the whole report on one page\n- `/profile build [--force]` - build or resume a saved reading; Ctrl+C keeps progress\n- `/profile saved [offset]` - read your saved profile\n- `/profile explain <number>` - inspect a saved finding's evidence\n- `/profile corrections [--all]` - everything you've told me\n- `/profile correct --track \"<title>\" --by \"<artist>\" (--like|--avoid)` - like a track, or keep it out\n- `/profile correct --artist \"<name>\" (--like|--avoid)` - like an artist, or keep them out\n- `/profile retract <correction-id>` - undo a choice\n- `/memory` - what I remember\n- `/tools` - what I can do right now\n- `/doctor` - check your setup\n- `/model` - pick the model I talk through\n- `/model <provider> <model>` - switch straight to a model\n- `/model refresh [provider]` - update public model choices; keep the selected model\n- `/auth [provider]` - sign in to a model provider\n- `/web status|search|read` - look things up on public music sites\n- `/import [path]` - bring in your history, library, or a playlist\n- `/language` - choose the language Moondog uses\n- `/spotify` - Spotify commands\n- `/spotify login [client-id]` - connect Spotify\n- `/spotify now|devices|queue` - see what's playing, where, and what's next\n- `/spotify recent|sync-recent` - see or save your latest plays\n- `/spotify import-history \"/path/to/spotify-history.zip\"` - add a Spotify ZIP, no sign-in needed\n- `/skip` or `/stop` - move to the next song preview, or stop them\n- `/reload` - reload model settings and sign-ins\n- `/remember [kind] <text>` - ask me to remember something\n- `/forget <memory-id>` - forget something\n- `/rewind` or Alt+R - edit an earlier message in place; the messages after it are replaced\n- `/branch` - go on from here in a new conversation; this one stays saved\n- `/rewind latest` - edit the most recent message\n- `/resume` - pick up a saved conversation\n- `/resume <session-id>` - go straight to one\n- `/new` - start fresh; the last one stays saved\n- `/quit` - exit\n\nAnything you type that isn't a command goes to the model you picked with `/model`, or the one set in `MOONDOG_PROVIDER` and `MOONDOG_MODEL`.\nSign in with `/auth`, or set the provider's API key in your environment. `/auth openai-codex` uses your ChatGPT sign-in.\nOnce your profile is ready, I can search your library, explain what I see, and plan playlists with you.\nI can only control Spotify after `moondog spotify login`, and I never post, send messages, delete anything, or spend money.\nAsk me to move playback onto a device by name, such as your iPhone.": "# Todos los comandos\n\nDesde tu terminal:\n\n- `moondog --version` - muestra la versión instalada\n- `moondog update [--check] [--channel latest|beta]` - busca o instala una versión publicada\n- `moondog web status|search|read [argumentos] [--json]` - consulta sitios de música públicos a través de DeepSeek, Brave Search o Codex CLI\n- `moondog demo-history --output <archivo-absoluto.zip> [--json]` - crea un ZIP de historial de Spotify ficticio para probar el importador\n- `moondog auth login <proveedor>` - inicia sesión en un proveedor de modelos; la clave se escribe sin mostrarse, y openai-codex usa tu cuenta de ChatGPT\n- `moondog auth status [proveedor]` - mira qué inicios de sesión están guardados\n- `moondog auth logout <proveedor>` - cierra la sesión de un proveedor\n- `moondog spotify help` - configura y controla Spotify\n- `moondog spotify login [client-id]` - conecta Spotify en tu navegador\n- `moondog spotify now|devices|queue` - mira qué suena en Spotify, dónde y qué viene después\n- `moondog spotify recent` - mira lo que escuchaste últimamente\n- `moondog spotify sync-recent` - añade tus últimas reproducciones a tu perfil\n- `moondog spotify sync-library` - añade tu biblioteca de Spotify a tu perfil\n- `moondog spotify play|pause|next|previous` - controla la reproducción de Spotify\n- `moondog listenbrainz import-history <listen-history.json>` - añade un archivo de escuchas de ListenBrainz a tu perfil\n- `moondog catalog latest-single --artist <nombre> [--known-release <título> | --from <spotify-history.zip>]` - encuentra el último sencillo de un artista en Apple Music (EE. UU.), sin modelo\n- `moondog status [--json]` - mira cómo está todo\n- `moondog taste [--json]` - tu informe de escucha\n- `moondog taste --html [--output <archivo.html>]` - guarda tu informe como página web que funciona sin conexión\n- `moondog taste --card [--output <archivo.html>]` - guarda un resumen breve que puedes revisar antes de compartirlo\n- `moondog taste --from <spotify-history.zip> --html` - un informe puntual de un ZIP de Spotify, sin guardarlo\n- `moondog taste --from <account-data.zip> --from <extended-history.zip> --html` - un informe puntual de ambas exportaciones de Spotify\n- `moondog taste --from <spotify-history.zip> --save --html` - guarda el historial de Spotify y muestra tu informe completo\n- `moondog data inspect --scope <listening|apple|profile>` - mira qué hay guardado y obtén el código para restablecerlo\n- `moondog data export --scope <listening|apple|profile> --output <carpeta>` - exporta una copia sin tocar el original\n- `moondog data reset --scope <listening|apple|profile> --confirm <código>` - aparta los datos guardados (se archivan, no se borran)\n- `moondog profile build [--force]` - crea o retoma un perfil guardado con tu modelo conectado\n- `moondog profile saved [desplazamiento]` - lee tu perfil guardado\n- `moondog profile explain <número>` - rastrea un hallazgo guardado hasta su evidencia\n- `moondog profile corrections [--all]` - todo lo que me has dicho, incluidas elecciones anteriores\n- `moondog profile correct --artist <nombre> (--like|--avoid)` - marca que te gusta un artista, o déjalo fuera\n- `moondog profile correct --track <título> --by <artista> (--like|--avoid)` - marca que te gusta una canción, o déjala fuera\n- `moondog profile retract <correction-id>` - deshaz una de tus elecciones\n- `moondog demo --offline [--json]` - una demo con datos inventados, sin iniciar sesión\n- `moondog demo [petición] [--json]` - la misma demo, hablando a través de tu modelo\n- `moondog ask <petición>` - haz una pregunta y sal\n- `moondog remember <texto>` - pídeme que recuerde algo\n- `moondog forget <memory-id>` - olvida algo\n- `moondog memory reflect [--dry-run] [--json]` - déjame repasar ahora las conversaciones recientes\n- `moondog` - abre la sala de escucha\n\nDentro de la sala de escucha:\n\n- `/update [--check] [--channel latest|beta]` - busca actualizaciones, o guarda y cierra esta sesión para instalar una\n- `/status` o `/sources` - mira cómo está todo\n- `/profile` o `/taste` - tu perfil, y por qué está cada canción o artista\n- `/taste report` - el informe completo en una página\n- `/profile build [--force]` - crea o retoma una lectura guardada; Ctrl+C conserva el progreso\n- `/profile saved [desplazamiento]` - lee tu perfil guardado\n- `/profile explain <número>` - revisa la evidencia de un hallazgo guardado\n- `/profile corrections [--all]` - todo lo que me has dicho\n- `/profile correct --track \"<título>\" --by \"<artista>\" (--like|--avoid)` - marca que te gusta una canción, o déjala fuera\n- `/profile correct --artist \"<nombre>\" (--like|--avoid)` - marca que te gusta un artista, o déjalo fuera\n- `/profile retract <correction-id>` - deshaz una elección\n- `/memory` - lo que recuerdo\n- `/tools` - lo que puedo hacer ahora mismo\n- `/doctor` - revisa tu configuración\n- `/model` - elige el modelo con el que hablo\n- `/model <proveedor> <modelo>` - cambia directamente a un modelo\n- `/model refresh [proveedor]` - actualiza las opciones públicas de modelos; mantiene el modelo elegido\n- `/auth [proveedor]` - inicia sesión en un proveedor de modelos\n- `/web status|search|read` - consulta sitios de música públicos\n- `/import [ruta]` - trae tu historial, tu biblioteca o una playlist\n- `/language` - elige el idioma de Moondog\n- `/spotify` - comandos de Spotify\n- `/spotify login [client-id]` - conecta Spotify\n- `/spotify now|devices|queue` - mira qué suena, dónde y qué viene después\n- `/spotify recent|sync-recent` - mira o guarda tus últimas reproducciones\n- `/spotify import-history \"/ruta/a/spotify-history.zip\"` - añade un ZIP de Spotify, sin iniciar sesión\n- `/skip` o `/stop` - pasa al siguiente avance, o detén los avances\n- `/reload` - recarga los ajustes del modelo y los inicios de sesión\n- `/remember [tipo] <texto>` - pídeme que recuerde algo\n- `/forget <memory-id>` - olvida algo\n- `/rewind` o Alt+R - edita un mensaje anterior en esta conversación; los mensajes siguientes se reemplazan\n- `/branch` - sigue desde aquí en una conversación nueva; esta queda guardada\n- `/rewind latest` - edita el mensaje más reciente\n- `/resume` - retoma una conversación guardada\n- `/resume <session-id>` - ve directamente a una\n- `/new` - empieza de cero; la anterior queda guardada\n- `/quit` - salir\n\nTodo lo que escribas que no sea un comando va al modelo que elegiste con `/model`, o al definido en `MOONDOG_PROVIDER` y `MOONDOG_MODEL`.\nInicia sesión con `/auth`, o define la clave de API del proveedor en tu entorno. `/auth openai-codex` usa tu cuenta de ChatGPT.\nCuando tu perfil esté listo, puedo buscar en tu biblioteca, explicarte lo que veo y planear playlists contigo.\nSolo puedo controlar Spotify después de `moondog spotify login`, y nunca publico, envío mensajes, borro nada ni gasto dinero.\nPídeme pasar la reproducción a un dispositivo por su nombre, como tu iPhone.",
|
|
179
|
+
"# Every command\n\nFrom your shell:\n\n- `moondog --version` - show the installed version\n- `moondog update [--check] [--channel latest|beta]` - check for or install a published release\n- `moondog web status|search|read [arguments] [--json]` - look things up on public music sites through DeepSeek, Brave Search or the Codex CLI\n- `moondog demo-history --output <absolute-file.zip> [--json]` - make a fictional Spotify history ZIP to try the importer with\n- `moondog auth login <provider>` - sign in to a model provider; the key is typed out of sight; `openai --chatgpt` signs in with your ChatGPT subscription\n- `moondog auth status [provider]` - see which sign-ins are saved\n- `moondog auth logout <provider>` - sign out of a provider\n- `moondog spotify help` - set up and control Spotify\n- `moondog spotify login [client-id]` - connect Spotify in your browser\n- `moondog spotify now|devices|queue` - see what Spotify is playing, where, and what's next\n- `moondog spotify recent` - see what you played lately\n- `moondog spotify sync-recent` - add your latest plays to your profile\n- `moondog spotify sync-library` - add your Spotify library to your profile\n- `moondog spotify play|pause|next|previous` - control Spotify playback\n- `moondog listenbrainz import-history <listen-history.json>` - add a ListenBrainz listens file to your profile\n- `moondog catalog latest-single --artist <name> [--known-release <title> | --from <spotify-history.zip>]` - find an artist's latest single on Apple Music (US), no model needed\n- `moondog status [--json]` - see where things stand\n- `moondog taste [--json]` - your listening report\n- `moondog taste --html [--output <file.html>]` - save your report as a web page that works offline\n- `moondog taste --card [--output <file.html>]` - save a short recap you can check before sharing\n- `moondog taste --from <spotify-history.zip> --html` - a one-off report from a Spotify ZIP, without saving it\n- `moondog taste --from <account-data.zip> --from <extended-history.zip> --html` - a one-off report from both Spotify exports together\n- `moondog taste --from <spotify-history.zip> --save --html` - save the Spotify history, then show your full report\n- `moondog data inspect --scope <listening|apple|profile>` - see what's stored, and get the code needed to reset it\n- `moondog data export --scope <listening|apple|profile> --output <directory>` - export a copy, leaving the original alone\n- `moondog data reset --scope <listening|apple|profile> --confirm <token>` - set stored data aside (it is archived, not deleted)\n- `moondog profile build [--force]` - build or resume a saved profile with your connected model\n- `moondog profile saved [offset]` - read your saved profile\n- `moondog profile explain <number>` - trace a saved finding to its evidence\n- `moondog profile corrections [--all]` - everything you've told me, including earlier choices\n- `moondog profile correct --artist <name> (--like|--avoid)` - like an artist, or keep them out\n- `moondog profile correct --track <title> --by <artist> (--like|--avoid)` - like a track, or keep it out\n- `moondog profile retract <correction-id>` - undo one of your choices\n- `moondog demo --offline [--json]` - a demo with made-up data, no sign-in needed\n- `moondog demo [prompt] [--json]` - the same demo, talking through your model\n- `moondog ask <prompt>` - ask one question and exit\n- `moondog remember <text>` - ask me to remember something\n- `moondog forget <memory-id>` - forget something\n- `moondog memory reflect [--dry-run] [--json]` - let me think over recent conversations now\n- `moondog` - open the listening room\n\nInside the listening room:\n\n- `/update [--check] [--channel latest|beta]` - check for updates, or save and close this session to install one\n- `/status` or `/sources` - see where things stand\n- `/profile` or `/taste` - your profile, and why each song or artist is there\n- `/taste report` - the whole report on one page\n- `/profile build [--force]` - build or resume a saved reading; Ctrl+C keeps progress\n- `/profile saved [offset]` - read your saved profile\n- `/profile explain <number>` - inspect a saved finding's evidence\n- `/profile corrections [--all]` - everything you've told me\n- `/profile correct --track \"<title>\" --by \"<artist>\" (--like|--avoid)` - like a track, or keep it out\n- `/profile correct --artist \"<name>\" (--like|--avoid)` - like an artist, or keep them out\n- `/profile retract <correction-id>` - undo a choice\n- `/memory` - what I remember\n- `/tools` - what I can do right now\n- `/doctor` - check your setup\n- `/model` - pick the model I talk through\n- `/model <provider> <model>` - switch straight to a model\n- `/model refresh [provider]` - update public model choices; keep the selected model\n- `/auth [provider]` - sign in to a model provider\n- `/web status|search|read` - look things up on public music sites\n- `/import [path]` - bring in your history, library, or a playlist\n- `/language` - choose the language Moondog uses\n- `/service [spotify|apple_music|netease]` - choose where I play music\n- `/spotify` - Spotify commands\n- `/spotify login [client-id]` - connect Spotify\n- `/spotify now|devices|queue` - see what's playing, where, and what's next\n- `/spotify recent|sync-recent` - see or save your latest plays\n- `/spotify import-history \"/path/to/spotify-history.zip\"` - add a Spotify ZIP, no sign-in needed\n- `/skip` or `/stop` - move to the next song preview, or stop them\n- `/reload` - reload model settings and sign-ins\n- `/remember [kind] <text>` - ask me to remember something\n- `/forget <memory-id>` - forget something\n- `/rewind` or Alt+R - edit an earlier message in place; the messages after it are replaced\n- `/branch` - go on from here in a new conversation; this one stays saved\n- `/rewind latest` - edit the most recent message\n- `/resume` - pick up a saved conversation\n- `/resume <session-id>` - go straight to one\n- `/new` - start fresh; the last one stays saved\n- `/quit` - exit\n\nAnything you type that isn't a command goes to the model you picked with `/model`, or the one set in `MOONDOG_PROVIDER` and `MOONDOG_MODEL`.\nSign in with `/auth`, or set the provider's API key in your environment. `/auth openai` signs in with your ChatGPT subscription or an API key.\nOnce your profile is ready, I can search your library, explain what I see, and plan playlists with you.\nI can only control Spotify after `moondog spotify login`, and I never post, send messages, delete anything, or spend money.\nAsk me to move playback onto a device by name, such as your iPhone.": "# Todos los comandos\n\nDesde tu terminal:\n\n- `moondog --version` - muestra la versión instalada\n- `moondog update [--check] [--channel latest|beta]` - busca o instala una versión publicada\n- `moondog web status|search|read [argumentos] [--json]` - consulta sitios de música públicos a través de DeepSeek, Brave Search o Codex CLI\n- `moondog demo-history --output <archivo-absoluto.zip> [--json]` - crea un ZIP de historial de Spotify ficticio para probar el importador\n- `moondog auth login <proveedor>` - inicia sesión en un proveedor de modelos; la clave se escribe sin mostrarse, y `openai --chatgpt` inicia sesión con tu suscripción de ChatGPT\n- `moondog auth status [proveedor]` - mira qué inicios de sesión están guardados\n- `moondog auth logout <proveedor>` - cierra la sesión de un proveedor\n- `moondog spotify help` - configura y controla Spotify\n- `moondog spotify login [client-id]` - conecta Spotify en tu navegador\n- `moondog spotify now|devices|queue` - mira qué suena en Spotify, dónde y qué viene después\n- `moondog spotify recent` - mira lo que escuchaste últimamente\n- `moondog spotify sync-recent` - añade tus últimas reproducciones a tu perfil\n- `moondog spotify sync-library` - añade tu biblioteca de Spotify a tu perfil\n- `moondog spotify play|pause|next|previous` - controla la reproducción de Spotify\n- `moondog listenbrainz import-history <listen-history.json>` - añade un archivo de escuchas de ListenBrainz a tu perfil\n- `moondog catalog latest-single --artist <nombre> [--known-release <título> | --from <spotify-history.zip>]` - encuentra el último sencillo de un artista en Apple Music (EE. UU.), sin modelo\n- `moondog status [--json]` - mira cómo está todo\n- `moondog taste [--json]` - tu informe de escucha\n- `moondog taste --html [--output <archivo.html>]` - guarda tu informe como página web que funciona sin conexión\n- `moondog taste --card [--output <archivo.html>]` - guarda un resumen breve que puedes revisar antes de compartirlo\n- `moondog taste --from <spotify-history.zip> --html` - un informe puntual de un ZIP de Spotify, sin guardarlo\n- `moondog taste --from <account-data.zip> --from <extended-history.zip> --html` - un informe puntual de ambas exportaciones de Spotify\n- `moondog taste --from <spotify-history.zip> --save --html` - guarda el historial de Spotify y muestra tu informe completo\n- `moondog data inspect --scope <listening|apple|profile>` - mira qué hay guardado y obtén el código para restablecerlo\n- `moondog data export --scope <listening|apple|profile> --output <carpeta>` - exporta una copia sin tocar el original\n- `moondog data reset --scope <listening|apple|profile> --confirm <código>` - aparta los datos guardados (se archivan, no se borran)\n- `moondog profile build [--force]` - crea o retoma un perfil guardado con tu modelo conectado\n- `moondog profile saved [desplazamiento]` - lee tu perfil guardado\n- `moondog profile explain <número>` - rastrea un hallazgo guardado hasta su evidencia\n- `moondog profile corrections [--all]` - todo lo que me has dicho, incluidas elecciones anteriores\n- `moondog profile correct --artist <nombre> (--like|--avoid)` - marca que te gusta un artista, o déjalo fuera\n- `moondog profile correct --track <título> --by <artista> (--like|--avoid)` - marca que te gusta una canción, o déjala fuera\n- `moondog profile retract <correction-id>` - deshaz una de tus elecciones\n- `moondog demo --offline [--json]` - una demo con datos inventados, sin iniciar sesión\n- `moondog demo [petición] [--json]` - la misma demo, hablando a través de tu modelo\n- `moondog ask <petición>` - haz una pregunta y sal\n- `moondog remember <texto>` - pídeme que recuerde algo\n- `moondog forget <memory-id>` - olvida algo\n- `moondog memory reflect [--dry-run] [--json]` - déjame repasar ahora las conversaciones recientes\n- `moondog` - abre la sala de escucha\n\nDentro de la sala de escucha:\n\n- `/update [--check] [--channel latest|beta]` - busca actualizaciones, o guarda y cierra esta sesión para instalar una\n- `/status` o `/sources` - mira cómo está todo\n- `/profile` o `/taste` - tu perfil, y por qué está cada canción o artista\n- `/taste report` - el informe completo en una página\n- `/profile build [--force]` - crea o retoma una lectura guardada; Ctrl+C conserva el progreso\n- `/profile saved [desplazamiento]` - lee tu perfil guardado\n- `/profile explain <número>` - revisa la evidencia de un hallazgo guardado\n- `/profile corrections [--all]` - todo lo que me has dicho\n- `/profile correct --track \"<título>\" --by \"<artista>\" (--like|--avoid)` - marca que te gusta una canción, o déjala fuera\n- `/profile correct --artist \"<nombre>\" (--like|--avoid)` - marca que te gusta un artista, o déjalo fuera\n- `/profile retract <correction-id>` - deshaz una elección\n- `/memory` - lo que recuerdo\n- `/tools` - lo que puedo hacer ahora mismo\n- `/doctor` - revisa tu configuración\n- `/model` - elige el modelo con el que hablo\n- `/model <proveedor> <modelo>` - cambia directamente a un modelo\n- `/model refresh [proveedor]` - actualiza las opciones públicas de modelos; mantiene el modelo elegido\n- `/auth [proveedor]` - inicia sesión en un proveedor de modelos\n- `/web status|search|read` - consulta sitios de música públicos\n- `/import [ruta]` - trae tu historial, tu biblioteca o una playlist\n- `/language` - elige el idioma de Moondog\n- `/service [spotify|apple_music|netease]` - elige dónde pongo la música\n- `/spotify` - comandos de Spotify\n- `/spotify login [client-id]` - conecta Spotify\n- `/spotify now|devices|queue` - mira qué suena, dónde y qué viene después\n- `/spotify recent|sync-recent` - mira o guarda tus últimas reproducciones\n- `/spotify import-history \"/ruta/a/spotify-history.zip\"` - añade un ZIP de Spotify, sin iniciar sesión\n- `/skip` o `/stop` - pasa al siguiente avance, o detén los avances\n- `/reload` - recarga los ajustes del modelo y los inicios de sesión\n- `/remember [tipo] <texto>` - pídeme que recuerde algo\n- `/forget <memory-id>` - olvida algo\n- `/rewind` o Alt+R - edita un mensaje anterior en esta conversación; los mensajes siguientes se reemplazan\n- `/branch` - sigue desde aquí en una conversación nueva; esta queda guardada\n- `/rewind latest` - edita el mensaje más reciente\n- `/resume` - retoma una conversación guardada\n- `/resume <session-id>` - ve directamente a una\n- `/new` - empieza de cero; la anterior queda guardada\n- `/quit` - salir\n\nTodo lo que escribas que no sea un comando va al modelo que elegiste con `/model`, o al definido en `MOONDOG_PROVIDER` y `MOONDOG_MODEL`.\nInicia sesión con `/auth`, o define la clave de API del proveedor en tu entorno. `/auth openai` inicia sesión con tu suscripción de ChatGPT o con una clave de API.\nCuando tu perfil esté listo, puedo buscar en tu biblioteca, explicarte lo que veo y planear playlists contigo.\nSolo puedo controlar Spotify después de `moondog spotify login`, y nunca publico, envío mensajes, borro nada ni gasto dinero.\nPídeme pasar la reproducción a un dispositivo por su nombre, como tu iPhone.",
|
|
180
180
|
"Apple Music library": "Biblioteca de Apple Music",
|
|
181
181
|
"Model": "Modelo",
|
|
182
182
|
"Finding similar music": "Buscar música parecida",
|
|
@@ -615,7 +615,6 @@ export default {
|
|
|
615
615
|
"Use /auth or /auth <provider>. Type API keys only into the hidden prompt that follows.": "Usa /auth o /auth <proveedor>. Escribe las claves de API solo en el campo oculto que aparece después.",
|
|
616
616
|
"Sign-in isn't available when Moondog is started this way.": "Iniciar sesión no está disponible cuando Moondog se abre de esta forma.",
|
|
617
617
|
"I can't sign in to that provider. Type /auth to see the ones I can.": "No puedo iniciar sesión en ese proveedor. Escribe /auth para ver los que sí.",
|
|
618
|
-
"ChatGPT sign-in": "Inicio de sesión de ChatGPT",
|
|
619
618
|
"API key": "Clave de API",
|
|
620
619
|
"Sign in to a model or web search service": "Inicia sesión en un proveedor de modelos o de búsqueda web",
|
|
621
620
|
"Sign-in cancelled.": "Inicio de sesión cancelado.",
|
|
@@ -771,7 +770,14 @@ export default {
|
|
|
771
770
|
"Cancelled.": "Cancelado.",
|
|
772
771
|
"/{command} didn't work.": "/{command} no funcionó.",
|
|
773
772
|
"Your request is still here · /model connects a model first.": "Tu petición sigue aquí · /model conecta primero un modelo.",
|
|
774
|
-
"
|
|
773
|
+
"Reading the room": "Tomándole el pulso a la sala",
|
|
774
|
+
"Checking the request line": "Revisando las peticiones",
|
|
775
|
+
"Finding the groove": "Buscando el groove",
|
|
776
|
+
"Working the decks": "Haciendo scratch",
|
|
777
|
+
"Planning the segue": "Pensando la transición",
|
|
778
|
+
"Mic check": "Probando el micro",
|
|
779
|
+
"Riding the faders": "Ajustando los faders",
|
|
780
|
+
"Finding the cue": "Buscando la entrada",
|
|
775
781
|
"{count} running · {label}": "{count} en marcha · {label}",
|
|
776
782
|
"{label} didn't work · carrying on...": "{label} no funcionó · sigo adelante...",
|
|
777
783
|
"Can't reach the model. Trying again ({attempt}/{max})...": "No puedo conectar con el modelo. Reintentando ({attempt}/{max})...",
|
|
@@ -969,4 +975,56 @@ export default {
|
|
|
969
975
|
"Web search key": "Clave de búsqueda web",
|
|
970
976
|
"Saved the {service} key. Web search goes through {provider}.": "Guardé la clave de {service}. La búsqueda web va por {provider}.",
|
|
971
977
|
"Saved the {service} key, but web search still isn't ready. Run `/web status` to see why.": "Guardé la clave de {service}, pero la búsqueda web todavía no está lista. Usa `/web status` para ver por qué.",
|
|
978
|
+
"Add an endpoint by its address": "Añadir un endpoint por su dirección",
|
|
979
|
+
"Remove an endpoint and its key": "Quitar un endpoint y su clave",
|
|
980
|
+
"ChatGPT sign-in or API key": "Sesión de ChatGPT o clave de API",
|
|
981
|
+
"ChatGPT subscription": "Suscripción de ChatGPT",
|
|
982
|
+
"Sign in with ChatGPT in your browser": "Inicia sesión con ChatGPT en tu navegador",
|
|
983
|
+
"Paste an OpenAI API key": "Pega una clave de API de OpenAI",
|
|
984
|
+
"How do you want to use OpenAI?": "¿Cómo quieres usar OpenAI?",
|
|
985
|
+
"Endpoints aren't available when Moondog is started this way.": "Los endpoints no están disponibles cuando Moondog se inicia así.",
|
|
986
|
+
"Use /endpoint, /endpoint add, or /endpoint remove <id>.": "Usa /endpoint, /endpoint add o /endpoint remove <id>.",
|
|
987
|
+
"Type `/model <id>` to talk through one, or `/endpoint add` to add another.": "Escribe `/model <id>` para hablar a través de uno, o `/endpoint add` para añadir otro.",
|
|
988
|
+
"No endpoints yet. `/endpoint add` adds any service that speaks OpenAI's or Anthropic's API, by its address.": "Todavía no hay endpoints. `/endpoint add` añade, por su dirección, cualquier servicio que hable la API de OpenAI o de Anthropic.",
|
|
989
|
+
"Endpoints listed.": "Endpoints listados.",
|
|
990
|
+
"Saved {name}. Type `/model {id}` to pick one of its models.": "{name} guardado. Escribe `/model {id}` para elegir uno de sus modelos.",
|
|
991
|
+
"Endpoint saved.": "Endpoint guardado.",
|
|
992
|
+
"Removed {name} and its key.": "Se quitaron {name} y su clave.",
|
|
993
|
+
"Endpoint removed.": "Endpoint quitado.",
|
|
994
|
+
"Add a model service by its address": "Añade un servicio de modelos por su dirección",
|
|
995
|
+
"Whole songs on your Spotify devices": "Canciones completas en tus dispositivos de Spotify",
|
|
996
|
+
"30-second previews, played here": "Avances de 30 segundos, aquí mismo",
|
|
997
|
+
"Whole songs through ncm-cli": "Canciones completas con ncm-cli",
|
|
998
|
+
"NetEase Music": "NetEase Music",
|
|
999
|
+
"Set up ncm-cli first": "Primero configura ncm-cli",
|
|
1000
|
+
"Sign in to {provider}": "Iniciar sesión en {provider}",
|
|
1001
|
+
"Choose another model": "Elegir otro modelo",
|
|
1002
|
+
"Choose a model": "Elegir un modelo",
|
|
1003
|
+
"Pick a provider and model, then sign in": "Elige un proveedor y un modelo, y luego inicia sesión",
|
|
1004
|
+
"Two things before we start: where I play your music, and the model I talk through.": "Dos cosas antes de empezar: dónde pongo tu música y el modelo con el que hablo.",
|
|
1005
|
+
"One thing before we start: where I play your music.": "Una cosa antes de empezar: dónde pongo tu música.",
|
|
1006
|
+
"One thing before we start: the model I talk through.": "Una cosa antes de empezar: el modelo con el que hablo.",
|
|
1007
|
+
"Where should I play music?": "¿Dónde pongo la música?",
|
|
1008
|
+
"Which model should I talk through?": "¿Con qué modelo hablo?",
|
|
1009
|
+
"/service changes it any time.": "/service lo cambia cuando quieras.",
|
|
1010
|
+
"{model} is saved, but you're not signed in to {provider} yet.": "{model} está guardado, pero aún no has iniciado sesión en {provider}.",
|
|
1011
|
+
"Sign in with ChatGPT, or use an API key from another provider. Your profile works without one.": "Inicia sesión con ChatGPT o usa una clave de API de otro proveedor. Tu perfil funciona sin modelo.",
|
|
1012
|
+
"NetEase plays through its own command line tool. Run this in another terminal, then choose it again:": "NetEase suena con su propia herramienta de línea de comandos. Ejecuta esto en otra terminal y vuelve a elegirlo:",
|
|
1013
|
+
"Welcome to the machine.": "Welcome to the machine.",
|
|
1014
|
+
"↑↓ ↵ choose · esc skip setup": "↑↓ ↵ elegir · esc saltar la configuración",
|
|
1015
|
+
"↑↓ choose · enter select · esc skip setup": "↑↓ elegir · enter seleccionar · esc saltar la configuración",
|
|
1016
|
+
"Spotify it is. /spotify help shows how to connect your account.": "Spotify, entonces. /spotify help explica cómo conectar tu cuenta.",
|
|
1017
|
+
"{service} it is.": "{service}, entonces.",
|
|
1018
|
+
"Choosing a music service isn't available when Moondog is started this way.": "Elegir un servicio de música no está disponible cuando Moondog se abre de esta forma.",
|
|
1019
|
+
"Use /service, or /service spotify, apple_music, or netease.": "Usa /service, o /service spotify, apple_music o netease.",
|
|
1020
|
+
"Music service unchanged.": "El servicio de música no ha cambiado.",
|
|
1021
|
+
"NetEase Music plays through its own command line tool. Run this in another terminal, then choose it again with `/service`:\n\n```\n{command}\n```": "NetEase Music suena con su propia herramienta de línea de comandos. Ejecuta esto en otra terminal y vuelve a elegirlo con `/service`:\n\n```\n{command}\n```",
|
|
1022
|
+
"NetEase needs ncm-cli first.": "NetEase necesita ncm-cli primero.",
|
|
1023
|
+
"Setup · music service": "Configuración · servicio de música",
|
|
1024
|
+
"Setup · model": "Configuración · modelo",
|
|
1025
|
+
"All set. /spotify help shows how to connect Spotify.": "Listo. /spotify help explica cómo conectar Spotify.",
|
|
1026
|
+
"All set. Say anything, or press Tab to look around.": "Listo. Di lo que quieras, o pulsa Tab para echar un vistazo.",
|
|
1027
|
+
"Skipped. /service and /model are here when you want them.": "Omitido. /service y /model siguen aquí cuando los quieras.",
|
|
1028
|
+
"Saving your music service...": "Guardando tu servicio de música...",
|
|
1029
|
+
"Choose where Moondog plays music": "Elige dónde pone Moondog la música",
|
|
972
1030
|
};
|