mastracode 0.49.1-alpha.0 → 0.50.0-alpha.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/CHANGELOG.md +21 -0
- package/dist/cli.cjs +3 -3
- package/dist/cli.js +3 -3
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/{login-command-EvJk2jIW.js → login-command-CT7RA_DY.js} +2 -2
- package/dist/{login-command-EvJk2jIW.js.map → login-command-CT7RA_DY.js.map} +1 -1
- package/dist/{login-command-COPViada.cjs → login-command-DvbCd7Pz.cjs} +2 -2
- package/dist/{login-command-COPViada.cjs.map → login-command-DvbCd7Pz.cjs.map} +1 -1
- package/dist/tui/voice/engines/cloud-engine.d.ts.map +1 -1
- package/dist/tui/voice/transcribe.d.ts +4 -54
- package/dist/tui/voice/transcribe.d.ts.map +1 -1
- package/dist/{tui-D5ou9NB5.js → tui-Ba0GZdaT.js} +18 -107
- package/dist/tui-Ba0GZdaT.js.map +1 -0
- package/dist/{tui-C0cxqVft.cjs → tui-DojlwY6e.cjs} +17 -106
- package/dist/tui-DojlwY6e.cjs.map +1 -0
- package/dist/tui.cjs +1 -1
- package/dist/tui.js +1 -1
- package/package.json +8 -10
- package/dist/tui-C0cxqVft.cjs.map +0 -1
- package/dist/tui-D5ou9NB5.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# mastracode
|
|
2
2
|
|
|
3
|
+
## 0.50.0-alpha.1
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Added Mistral Voxtral as a speech-to-text provider for voice input. Pick `mistral` in `/voice` and set `MISTRAL_API_KEY` (or add a key with `/api-keys`) to dictate with `voxtral-mini-latest`. ([#29363](https://github.com/mastra-ai/mastra/pull/29363))
|
|
8
|
+
|
|
9
|
+
Fixed voice input with Groq and the other OpenAI-compatible hosts failing with "No API key provided for speech model" when `OPENAI_API_KEY` was not set.
|
|
10
|
+
|
|
11
|
+
Fixed voice input with NEAR AI ignoring `NEARAI_API_KEY`. `NEAR_AI_API_KEY` is no longer read; rename it to `NEARAI_API_KEY`.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [[`a0068a9`](https://github.com/mastra-ai/mastra/commit/a0068a9ad1fb0a31ae60a07ecbeae41a32ea4081), [`bb0fcd6`](https://github.com/mastra-ai/mastra/commit/bb0fcd6211a416cece10c20e11f6f3cb70b4c93b), [`459757f`](https://github.com/mastra-ai/mastra/commit/459757f07de6905c6abdfc3b08a7f48a808dcc6b), [`592a907`](https://github.com/mastra-ai/mastra/commit/592a9071cae12ef7d1defa5f7942f1a9cbdaa340), [`3cf319b`](https://github.com/mastra-ai/mastra/commit/3cf319b5af74aeebb1b70bd29ec539fbd2af4bb8), [`8960f55`](https://github.com/mastra-ai/mastra/commit/8960f55dec7ebf39b460ee8664509d2924065b86), [`b518fc9`](https://github.com/mastra-ai/mastra/commit/b518fc9abeb05093aff4b1bb3e74f018e3612078), [`68869db`](https://github.com/mastra-ai/mastra/commit/68869dbb53034aee5868bccef4691af61bf6656e), [`cd369c3`](https://github.com/mastra-ai/mastra/commit/cd369c334cf5af81597d7d61e7419b390f92365b), [`f94beac`](https://github.com/mastra-ai/mastra/commit/f94beac86288cb94e2973c9ed492c8f0d68b919d), [`544224c`](https://github.com/mastra-ai/mastra/commit/544224c38f61d08a0b9952d202366fb3c6cc5bd9), [`a873e2d`](https://github.com/mastra-ai/mastra/commit/a873e2df4335b4cd7d50d4d2d26b166f976af9e3), [`d6a5f98`](https://github.com/mastra-ai/mastra/commit/d6a5f98df3a1f6d11743e0bdf150358d7db4dd40), [`d6a5f98`](https://github.com/mastra-ai/mastra/commit/d6a5f98df3a1f6d11743e0bdf150358d7db4dd40), [`defb820`](https://github.com/mastra-ai/mastra/commit/defb82048f6e78bde95c10ffa0ca36f20d714f41), [`23308f9`](https://github.com/mastra-ai/mastra/commit/23308f9c193ef852c28f6ec1c6e872f75363c5f7), [`83b6997`](https://github.com/mastra-ai/mastra/commit/83b6997a2ac9e2a3d94bcfe4de181b32a26cf7c6), [`36bbc29`](https://github.com/mastra-ai/mastra/commit/36bbc291292170e68774d6e9a7c76b6a5d930dd8), [`f79db0d`](https://github.com/mastra-ai/mastra/commit/f79db0de42bc8205fe62b39c1fe78932661b5e14), [`e14e5df`](https://github.com/mastra-ai/mastra/commit/e14e5dfb7a50422ef84e3623c823d8b782dec330), [`8d07b0b`](https://github.com/mastra-ai/mastra/commit/8d07b0b293812d84c3f45c2806eb53ed45f58324), [`f7320ab`](https://github.com/mastra-ai/mastra/commit/f7320abd205aa865e3ae467b7bf82373af30a6aa), [`d6a5f98`](https://github.com/mastra-ai/mastra/commit/d6a5f98df3a1f6d11743e0bdf150358d7db4dd40), [`459757f`](https://github.com/mastra-ai/mastra/commit/459757f07de6905c6abdfc3b08a7f48a808dcc6b), [`2f93851`](https://github.com/mastra-ai/mastra/commit/2f93851c37410a9d9740263a636e802ef9ee2f8d), [`75983cd`](https://github.com/mastra-ai/mastra/commit/75983cdb05ffa4f70aac528220c7fbe5cfa2baf3)]:
|
|
16
|
+
- @mastra/core@1.83.0-alpha.1
|
|
17
|
+
- @mastra/code-sdk@1.19.0-alpha.1
|
|
18
|
+
- @mastra/mcp@2.9.0-alpha.1
|
|
19
|
+
- @mastra/pg@1.36.0-alpha.1
|
|
20
|
+
- @mastra/duckdb@1.19.0-alpha.1
|
|
21
|
+
- @mastra/observability@1.23.2-alpha.1
|
|
22
|
+
- @mastra/libsql@1.30.0-alpha.0
|
|
23
|
+
|
|
3
24
|
## 0.49.1-alpha.0
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
package/dist/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const require_tui = require("./tui-
|
|
2
|
+
const require_tui = require("./tui-DojlwY6e.cjs");
|
|
3
3
|
let _mastra_code_sdk = require("@mastra/code-sdk");
|
|
4
4
|
let child_process = require("child_process");
|
|
5
5
|
let fs = require("fs");
|
|
@@ -265,7 +265,7 @@ async function runUpdateCommand({ args = [], output = process.stdout, errorOutpu
|
|
|
265
265
|
}
|
|
266
266
|
// src/version.ts
|
|
267
267
|
function getCurrentVersion() {
|
|
268
|
-
return "0.
|
|
268
|
+
return "0.50.0-alpha.1";
|
|
269
269
|
}
|
|
270
270
|
/** Whether the invocation is `mastracode --version` or `mastracode -v`. */
|
|
271
271
|
function isVersionCommand(argv) {
|
|
@@ -650,7 +650,7 @@ async function main() {
|
|
|
650
650
|
}
|
|
651
651
|
const loginIndex = process.argv.findIndex((arg, index) => index >= 2 && arg !== "--acp" && arg !== "--dangerous-auto-approve");
|
|
652
652
|
if (process.argv[loginIndex] === "login") {
|
|
653
|
-
const { runLoginCommand } = await Promise.resolve().then(() => require("./login-command-
|
|
653
|
+
const { runLoginCommand } = await Promise.resolve().then(() => require("./login-command-DvbCd7Pz.cjs"));
|
|
654
654
|
const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });
|
|
655
655
|
await new Promise((resolve) => process.stdout.write("", resolve));
|
|
656
656
|
return process.exit(code);
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { D as closeActiveBrowser, E as activeBrowserGeneration, O as discardBrowser, T as TUI_CO_AUTHOR, _ as normalizeThemePreference, a as formatUpdateHeader, g as applyThemePreference, i as formatUpToDate, k as replaceActiveBrowser, n as formatInstallingLabel, o as formatUpdateOutcome, r as formatRegistryError, t as MastraTUI } from "./tui-
|
|
2
|
+
import { D as closeActiveBrowser, E as activeBrowserGeneration, O as discardBrowser, T as TUI_CO_AUTHOR, _ as normalizeThemePreference, a as formatUpdateHeader, g as applyThemePreference, i as formatUpToDate, k as replaceActiveBrowser, n as formatInstallingLabel, o as formatUpdateOutcome, r as formatRegistryError, t as MastraTUI } from "./tui-Ba0GZdaT.js";
|
|
3
3
|
import { createMastraCode, resolveSubagentsSetting } from "@mastra/code-sdk";
|
|
4
4
|
import { spawn } from "child_process";
|
|
5
5
|
import fs from "fs";
|
|
@@ -264,7 +264,7 @@ async function runUpdateCommand({ args = [], output = process.stdout, errorOutpu
|
|
|
264
264
|
}
|
|
265
265
|
// src/version.ts
|
|
266
266
|
function getCurrentVersion() {
|
|
267
|
-
return "0.
|
|
267
|
+
return "0.50.0-alpha.1";
|
|
268
268
|
}
|
|
269
269
|
/** Whether the invocation is `mastracode --version` or `mastracode -v`. */
|
|
270
270
|
function isVersionCommand(argv) {
|
|
@@ -649,7 +649,7 @@ async function main() {
|
|
|
649
649
|
}
|
|
650
650
|
const loginIndex = process.argv.findIndex((arg, index) => index >= 2 && arg !== "--acp" && arg !== "--dangerous-auto-approve");
|
|
651
651
|
if (process.argv[loginIndex] === "login") {
|
|
652
|
-
const { runLoginCommand } = await import("./login-command-
|
|
652
|
+
const { runLoginCommand } = await import("./login-command-CT7RA_DY.js");
|
|
653
653
|
const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });
|
|
654
654
|
await new Promise((resolve) => process.stdout.write("", resolve));
|
|
655
655
|
return process.exit(code);
|
package/dist/docs/SKILL.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AuthStorage, getOAuthProviders } from "@mastra/code-sdk/auth/storage";
|
|
2
|
-
import { Writable } from "stream";
|
|
3
2
|
import { openUrlInBrowser } from "@mastra/code-sdk/utils/open-url";
|
|
4
3
|
import { parseArgs } from "util";
|
|
5
4
|
import { PROVIDER_REGISTRY } from "@mastra/core/llm";
|
|
6
5
|
import { createInterface } from "readline";
|
|
6
|
+
import { Writable } from "stream";
|
|
7
7
|
// src/login-command.ts
|
|
8
8
|
async function choose(ask, labels, say) {
|
|
9
9
|
labels.forEach((label, index) => say(` ${index + 1}. ${label}`));
|
|
@@ -94,4 +94,4 @@ async function runLoginCommand({ args = [], input = process.stdin, output = proc
|
|
|
94
94
|
}
|
|
95
95
|
export { runLoginCommand };
|
|
96
96
|
|
|
97
|
-
//# sourceMappingURL=login-command-
|
|
97
|
+
//# sourceMappingURL=login-command-CT7RA_DY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-command-
|
|
1
|
+
{"version":3,"file":"login-command-CT7RA_DY.js","names":[],"sources":["../src/login-command.ts"],"sourcesContent":["import { createInterface } from 'node:readline';\nimport { Writable } from 'node:stream';\nimport type { Readable } from 'node:stream';\nimport { parseArgs } from 'node:util';\nimport { AuthStorage, getOAuthProviders } from '@mastra/code-sdk/auth/storage';\nimport type { OAuthProviderInterface } from '@mastra/code-sdk/auth/types';\nimport { openUrlInBrowser } from '@mastra/code-sdk/utils/open-url';\nimport { PROVIDER_REGISTRY } from '@mastra/core/llm';\n\ntype Ask = (prompt: string, options?: { secret?: boolean }) => Promise<string>;\n\ninterface LoginCommandOptions {\n args?: string[];\n input?: Readable & { isTTY?: boolean };\n output?: NodeJS.WritableStream;\n authStorage?: AuthStorage;\n openUrl?: (url: string) => void;\n}\n\nasync function choose(ask: Ask, labels: string[], say: (line: string) => void): Promise<number | undefined> {\n labels.forEach((label, index) => say(` ${index + 1}. ${label}`));\n const index = Number((await ask('Choose an option: ')).trim()) - 1;\n return Number.isInteger(index) && index >= 0 && index < labels.length ? index : undefined;\n}\n\nasync function signIn(\n ask: Ask,\n provider: OAuthProviderInterface,\n authStorage: AuthStorage,\n openUrl: (url: string) => void,\n say: (line: string) => void,\n): Promise<void> {\n const modes = provider.authModes ?? [];\n let authMode: string | undefined;\n if (modes.length > 1) {\n const index = await choose(\n ask,\n modes.map(mode => mode.name),\n say,\n );\n if (index === undefined) throw new Error('No sign-in method selected');\n authMode = modes[index]!.id;\n }\n await authStorage.login(provider.id, {\n authMode,\n onAuth: ({ url, instructions }) => {\n say(`Open ${url} to sign in`);\n if (instructions) say(instructions);\n openUrl(url);\n },\n onPrompt: ({ message, placeholder }) => ask(`${message}${placeholder ? ` (${placeholder})` : ''} `),\n onProgress: say,\n });\n say(`Signed in to ${provider.name}`);\n}\n\nasync function addApiKey(ask: Ask, authStorage: AuthStorage, say: (line: string) => void): Promise<void> {\n const providerId = (await ask('Provider (for example anthropic, openai, google): ')).trim();\n if (!(providerId in PROVIDER_REGISTRY)) throw new Error(`Unknown provider: ${providerId}`);\n const key = (await ask('API key: ', { secret: true })).trim();\n say('');\n if (!key) throw new Error('No API key entered');\n authStorage.setStoredApiKey(providerId, key);\n say(`Saved the ${providerId} API key`);\n}\n\nexport async function runLoginCommand({\n args = [],\n input = process.stdin,\n output = process.stdout,\n authStorage = new AuthStorage(),\n openUrl = openUrlInBrowser,\n}: LoginCommandOptions = {}): Promise<number> {\n let echo = false;\n const rl = createInterface({\n input,\n output: new Writable({\n write(chunk, encoding, callback) {\n if (echo) output.write(chunk, encoding);\n callback();\n },\n }),\n prompt: '',\n terminal: Boolean(input.isTTY),\n });\n rl.on('line', () => {\n echo = false;\n });\n const lines = rl[Symbol.asyncIterator]();\n const say = (line: string) => output.write(`${line}\\n`);\n const ask: Ask = async (prompt, { secret = false } = {}) => {\n output.write(prompt);\n echo = !secret;\n const line = await lines.next();\n echo = false;\n if (line.done) throw new Error('Input ended before sign-in finished');\n return line.value;\n };\n try {\n const providers = getOAuthProviders();\n const { values } = parseArgs({ args, options: { provider: { type: 'string' } } });\n if (values.provider !== undefined) {\n const provider = providers.find(({ id }) => id === values.provider);\n if (!provider) {\n const ids = providers.map(({ id }) => id).join(', ');\n throw new Error(`Unknown provider: ${values.provider}. Use one of: ${ids}`);\n }\n await signIn(ask, provider, authStorage, openUrl, say);\n return 0;\n }\n say('Sign in to Mastra Code');\n const index = await choose(ask, [...providers.map(provider => provider.name), 'Add an API key'], say);\n if (index === undefined) throw new Error('No option selected');\n const provider = providers[index];\n if (provider) {\n await signIn(ask, provider, authStorage, openUrl, say);\n } else {\n await addApiKey(ask, authStorage, say);\n }\n return 0;\n } catch (error) {\n say(`Sign-in failed: ${error instanceof Error ? error.message : String(error)}`);\n return 1;\n } finally {\n rl.close();\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
let _mastra_code_sdk_auth_storage = require("@mastra/code-sdk/auth/storage");
|
|
2
|
-
let stream = require("stream");
|
|
3
2
|
let _mastra_code_sdk_utils_open_url = require("@mastra/code-sdk/utils/open-url");
|
|
4
3
|
let util = require("util");
|
|
5
4
|
let _mastra_core_llm = require("@mastra/core/llm");
|
|
6
5
|
let readline = require("readline");
|
|
6
|
+
let stream = require("stream");
|
|
7
7
|
// src/login-command.ts
|
|
8
8
|
async function choose(ask, labels, say) {
|
|
9
9
|
labels.forEach((label, index) => say(` ${index + 1}. ${label}`));
|
|
@@ -94,4 +94,4 @@ async function runLoginCommand({ args = [], input = process.stdin, output = proc
|
|
|
94
94
|
}
|
|
95
95
|
exports.runLoginCommand = runLoginCommand;
|
|
96
96
|
|
|
97
|
-
//# sourceMappingURL=login-command-
|
|
97
|
+
//# sourceMappingURL=login-command-DvbCd7Pz.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-command-
|
|
1
|
+
{"version":3,"file":"login-command-DvbCd7Pz.cjs","names":["PROVIDER_REGISTRY","AuthStorage","openUrlInBrowser","createInterface","Writable","getOAuthProviders","parseArgs"],"sources":["../src/login-command.ts"],"sourcesContent":["import { createInterface } from 'node:readline';\nimport { Writable } from 'node:stream';\nimport type { Readable } from 'node:stream';\nimport { parseArgs } from 'node:util';\nimport { AuthStorage, getOAuthProviders } from '@mastra/code-sdk/auth/storage';\nimport type { OAuthProviderInterface } from '@mastra/code-sdk/auth/types';\nimport { openUrlInBrowser } from '@mastra/code-sdk/utils/open-url';\nimport { PROVIDER_REGISTRY } from '@mastra/core/llm';\n\ntype Ask = (prompt: string, options?: { secret?: boolean }) => Promise<string>;\n\ninterface LoginCommandOptions {\n args?: string[];\n input?: Readable & { isTTY?: boolean };\n output?: NodeJS.WritableStream;\n authStorage?: AuthStorage;\n openUrl?: (url: string) => void;\n}\n\nasync function choose(ask: Ask, labels: string[], say: (line: string) => void): Promise<number | undefined> {\n labels.forEach((label, index) => say(` ${index + 1}. ${label}`));\n const index = Number((await ask('Choose an option: ')).trim()) - 1;\n return Number.isInteger(index) && index >= 0 && index < labels.length ? index : undefined;\n}\n\nasync function signIn(\n ask: Ask,\n provider: OAuthProviderInterface,\n authStorage: AuthStorage,\n openUrl: (url: string) => void,\n say: (line: string) => void,\n): Promise<void> {\n const modes = provider.authModes ?? [];\n let authMode: string | undefined;\n if (modes.length > 1) {\n const index = await choose(\n ask,\n modes.map(mode => mode.name),\n say,\n );\n if (index === undefined) throw new Error('No sign-in method selected');\n authMode = modes[index]!.id;\n }\n await authStorage.login(provider.id, {\n authMode,\n onAuth: ({ url, instructions }) => {\n say(`Open ${url} to sign in`);\n if (instructions) say(instructions);\n openUrl(url);\n },\n onPrompt: ({ message, placeholder }) => ask(`${message}${placeholder ? ` (${placeholder})` : ''} `),\n onProgress: say,\n });\n say(`Signed in to ${provider.name}`);\n}\n\nasync function addApiKey(ask: Ask, authStorage: AuthStorage, say: (line: string) => void): Promise<void> {\n const providerId = (await ask('Provider (for example anthropic, openai, google): ')).trim();\n if (!(providerId in PROVIDER_REGISTRY)) throw new Error(`Unknown provider: ${providerId}`);\n const key = (await ask('API key: ', { secret: true })).trim();\n say('');\n if (!key) throw new Error('No API key entered');\n authStorage.setStoredApiKey(providerId, key);\n say(`Saved the ${providerId} API key`);\n}\n\nexport async function runLoginCommand({\n args = [],\n input = process.stdin,\n output = process.stdout,\n authStorage = new AuthStorage(),\n openUrl = openUrlInBrowser,\n}: LoginCommandOptions = {}): Promise<number> {\n let echo = false;\n const rl = createInterface({\n input,\n output: new Writable({\n write(chunk, encoding, callback) {\n if (echo) output.write(chunk, encoding);\n callback();\n },\n }),\n prompt: '',\n terminal: Boolean(input.isTTY),\n });\n rl.on('line', () => {\n echo = false;\n });\n const lines = rl[Symbol.asyncIterator]();\n const say = (line: string) => output.write(`${line}\\n`);\n const ask: Ask = async (prompt, { secret = false } = {}) => {\n output.write(prompt);\n echo = !secret;\n const line = await lines.next();\n echo = false;\n if (line.done) throw new Error('Input ended before sign-in finished');\n return line.value;\n };\n try {\n const providers = getOAuthProviders();\n const { values } = parseArgs({ args, options: { provider: { type: 'string' } } });\n if (values.provider !== undefined) {\n const provider = providers.find(({ id }) => id === values.provider);\n if (!provider) {\n const ids = providers.map(({ id }) => id).join(', ');\n throw new Error(`Unknown provider: ${values.provider}. Use one of: ${ids}`);\n }\n await signIn(ask, provider, authStorage, openUrl, say);\n return 0;\n }\n say('Sign in to Mastra Code');\n const index = await choose(ask, [...providers.map(provider => provider.name), 'Add an API key'], say);\n if (index === undefined) throw new Error('No option selected');\n const provider = providers[index];\n if (provider) {\n await signIn(ask, provider, authStorage, openUrl, say);\n } else {\n await addApiKey(ask, authStorage, say);\n }\n return 0;\n } catch (error) {\n say(`Sign-in failed: ${error instanceof Error ? error.message : String(error)}`);\n return 1;\n } finally {\n rl.close();\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-engine.d.ts","sourceRoot":"","sources":["../../../../src/tui/voice/engines/cloud-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAKjE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAa7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"cloud-engine.d.ts","sourceRoot":"","sources":["../../../../src/tui/voice/engines/cloud-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAKjE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAa7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAiID,qBAAa,cAAe,YAAW,SAAS;IAGlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,YAA6B,OAAO,EAAE,kBAAkB,EAAI;IAE5D,UAAU,IAAI,MAAM,GAAG,IAAI,CAM1B;IAED,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,UAAU,CAchD;CACF"}
|
|
@@ -1,63 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Speech-to-text transcription for push-to-talk voice input (cloud path).
|
|
3
|
-
*
|
|
4
|
-
* Provider-agnostic: most supported cloud providers speak the OpenAI
|
|
5
|
-
* `/audio/transcriptions` shape (see `stt-registry.ts`), so we drive them
|
|
6
|
-
* through Mastra's own voice abstraction — `OpenAIVoice` (a `MastraVoice`) from
|
|
7
|
-
* `@mastra/voice-openai`. The `openai` provider uses the default endpoint; every
|
|
8
|
-
* other OpenAI-compatible host is reached by pointing the underlying client at
|
|
9
|
-
* its `baseURL`. Deepgram is not OpenAI-compatible, so it is driven through
|
|
10
|
-
* `DeepgramVoice` from `@mastra/voice-deepgram` instead.
|
|
11
|
-
*
|
|
12
|
-
* Using `MastraVoice.listen()` keeps this aligned with the framework's voice
|
|
13
|
-
* ecosystem and normalizes provider responses to a transcript string. The voice
|
|
14
|
-
* package constructs its own SDK client internally, so this avoids coupling to a
|
|
15
|
-
* specific `@ai-sdk/*` model-spec version.
|
|
16
|
-
*
|
|
17
|
-
* Note: OpenAI OAuth (Codex) tokens cannot be used for the audio transcription
|
|
18
|
-
* REST endpoint, so a real provider API key is required.
|
|
19
|
-
*/
|
|
20
1
|
import type { AuthStorage } from '@mastra/code-sdk/auth/storage';
|
|
2
|
+
import type { CloudEngineOptions } from './engines/cloud-engine.js';
|
|
3
|
+
export declare function voiceCredentialMessage(provider: string): string;
|
|
21
4
|
export declare class VoiceCredentialError extends Error {
|
|
22
5
|
constructor(provider: string);
|
|
23
6
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Resolve an API key for a cloud STT provider.
|
|
26
|
-
* Honors the env-overrides-stored-key contract: the provider's env var wins,
|
|
27
|
-
* then the stored credential is used as a fallback.
|
|
28
|
-
*/
|
|
29
|
-
export declare function resolveProviderApiKey(provider: string, authStorage?: AuthStorage): string | undefined;
|
|
30
|
-
export interface TranscribeOptions {
|
|
31
|
-
/** STT provider id (see `stt-registry.ts`). Defaults to the registry default. */
|
|
32
|
-
provider?: string;
|
|
33
|
-
/** Model id within the provider. Defaults to the provider's default model. */
|
|
34
|
-
model?: string;
|
|
35
|
-
authStorage?: AuthStorage;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Transcribe recorded WAV audio to text via the configured cloud provider.
|
|
39
|
-
* Throws VoiceCredentialError if no API key is available for the provider.
|
|
40
|
-
*/
|
|
41
|
-
export declare function transcribeAudio(audio: Buffer, options?: TranscribeOptions): Promise<string>;
|
|
42
|
-
/**
|
|
43
|
-
* A reusable transcriber bound to one provider/model. Building the underlying
|
|
44
|
-
* `MastraVoice` client once and reusing it across calls lets the HTTP client
|
|
45
|
-
* keep its connection to the provider warm (keep-alive), which removes the
|
|
46
|
-
* DNS + TLS handshake cost from every live-partial tick — the main reason the
|
|
47
|
-
* first dictation streams in slowly while later ones feel instant.
|
|
48
|
-
*/
|
|
49
7
|
export interface ReusableTranscriber {
|
|
50
8
|
transcribe(audio: Buffer): Promise<string>;
|
|
51
9
|
}
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
* Resolves the provider/model and API key once up front (throwing
|
|
55
|
-
* `VoiceCredentialError` if no key is available), so a session can build it on
|
|
56
|
-
* start and call `transcribe()` per tick without re-resolving or reconnecting.
|
|
57
|
-
*/
|
|
58
|
-
export declare function createTranscriber(options?: TranscribeOptions): ReusableTranscriber;
|
|
59
|
-
/**
|
|
60
|
-
* Check whether a cloud STT provider has a usable API key, without recording.
|
|
61
|
-
*/
|
|
10
|
+
/** Throws `VoiceCredentialError` up front when the provider has no key. */
|
|
11
|
+
export declare function createTranscriber(options: CloudEngineOptions): ReusableTranscriber;
|
|
62
12
|
export declare function hasProviderCredential(provider: string, authStorage?: AuthStorage): boolean;
|
|
63
13
|
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/tui/voice/transcribe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/tui/voice/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAIjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,QAAQ,EAAE,MAAM,EAG3B;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,CAYlF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAE1F"}
|
|
@@ -26,8 +26,8 @@ import { DEFAULT_MAX_TURNS, GoalManager } from "@mastra/code-sdk/goal-manager";
|
|
|
26
26
|
import { buildContextAudit } from "@mastra/code-sdk/agents/context-audit";
|
|
27
27
|
import { getDynamicInstructionSections } from "@mastra/code-sdk/agents/instructions";
|
|
28
28
|
import { formatSkillsCatalog } from "@mastra/core/processors";
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
29
|
+
import { defaultModelForProvider, resolveSTTModel, sttModelsForProvider, sttProviders } from "@mastra/code-sdk/voice/stt-registry";
|
|
30
|
+
import { createSTTTranscriber, resolveSTTApiKey, sttApiKeyEnvVar } from "@mastra/code-sdk/voice/transcribe";
|
|
31
31
|
import { THINK_COMMAND_DESCRIPTOR, isThinkingLevelSetting, parseThinkCommand } from "@mastra/code-sdk/thinking";
|
|
32
32
|
import { getCatalogThinkingLevels, runCatalogThinkingLevel } from "@mastra/code-sdk/thinking-catalog";
|
|
33
33
|
import { VALID_EVENTS } from "@mastra/code-sdk/hooks/index";
|
|
@@ -4419,111 +4419,29 @@ async function openMacSettings(url) {
|
|
|
4419
4419
|
});
|
|
4420
4420
|
}
|
|
4421
4421
|
// src/tui/voice/transcribe.ts
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
* `/audio/transcriptions` shape (see `stt-registry.ts`), so we drive them
|
|
4427
|
-
* through Mastra's own voice abstraction — `OpenAIVoice` (a `MastraVoice`) from
|
|
4428
|
-
* `@mastra/voice-openai`. The `openai` provider uses the default endpoint; every
|
|
4429
|
-
* other OpenAI-compatible host is reached by pointing the underlying client at
|
|
4430
|
-
* its `baseURL`. Deepgram is not OpenAI-compatible, so it is driven through
|
|
4431
|
-
* `DeepgramVoice` from `@mastra/voice-deepgram` instead.
|
|
4432
|
-
*
|
|
4433
|
-
* Using `MastraVoice.listen()` keeps this aligned with the framework's voice
|
|
4434
|
-
* ecosystem and normalizes provider responses to a transcript string. The voice
|
|
4435
|
-
* package constructs its own SDK client internally, so this avoids coupling to a
|
|
4436
|
-
* specific `@ai-sdk/*` model-spec version.
|
|
4437
|
-
*
|
|
4438
|
-
* Note: OpenAI OAuth (Codex) tokens cannot be used for the audio transcription
|
|
4439
|
-
* REST endpoint, so a real provider API key is required.
|
|
4440
|
-
*/
|
|
4441
|
-
/**
|
|
4442
|
-
* Per-provider environment variable that holds an API key, checked before the
|
|
4443
|
-
* stored credential. Mirrors the key names used elsewhere in MastraCode.
|
|
4444
|
-
*/
|
|
4445
|
-
const PROVIDER_ENV_VAR = {
|
|
4446
|
-
openai: "OPENAI_API_KEY",
|
|
4447
|
-
groq: "GROQ_API_KEY",
|
|
4448
|
-
alibaba: "DASHSCOPE_API_KEY",
|
|
4449
|
-
"alibaba-cn": "DASHSCOPE_API_KEY",
|
|
4450
|
-
scaleway: "SCALEWAY_API_KEY",
|
|
4451
|
-
nvidia: "NVIDIA_API_KEY",
|
|
4452
|
-
nearai: "NEAR_AI_API_KEY",
|
|
4453
|
-
evroc: "EVROC_API_KEY",
|
|
4454
|
-
deepgram: "DEEPGRAM_API_KEY"
|
|
4455
|
-
};
|
|
4422
|
+
function voiceCredentialMessage(provider) {
|
|
4423
|
+
const envVar = sttApiKeyEnvVar(provider);
|
|
4424
|
+
return `Voice input needs a ${provider} API key. ${envVar ? `Set ${envVar} or add one with /api-keys` : "Add one with /api-keys"} (OAuth tokens are not supported for transcription).`;
|
|
4425
|
+
}
|
|
4456
4426
|
var VoiceCredentialError = class extends Error {
|
|
4457
4427
|
constructor(provider) {
|
|
4458
|
-
super(
|
|
4428
|
+
super(voiceCredentialMessage(provider));
|
|
4459
4429
|
this.name = "VoiceCredentialError";
|
|
4460
4430
|
}
|
|
4461
4431
|
};
|
|
4462
|
-
/**
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
*/
|
|
4467
|
-
function resolveProviderApiKey(provider, authStorage) {
|
|
4468
|
-
const envVar = PROVIDER_ENV_VAR[provider];
|
|
4469
|
-
const fromEnv = envVar ? process.env[envVar]?.trim() : void 0;
|
|
4470
|
-
if (fromEnv) return fromEnv;
|
|
4471
|
-
return authStorage?.getStoredApiKey(provider);
|
|
4472
|
-
}
|
|
4473
|
-
/**
|
|
4474
|
-
* Build a `MastraVoice` for an STT registry entry.
|
|
4475
|
-
* - `deepgram`: `DeepgramVoice` (Deepgram SDK; not OpenAI-compatible).
|
|
4476
|
-
* - everything else: `OpenAIVoice`, where `listeningModel.name` is the model id
|
|
4477
|
-
* and `options.baseURL` redirects OpenAI-compatible hosts at their endpoint.
|
|
4478
|
-
*/
|
|
4479
|
-
async function buildVoice(entry, apiKey) {
|
|
4480
|
-
if (entry.resolver === "deepgram") {
|
|
4481
|
-
const { DeepgramVoice } = await import("@mastra/voice-deepgram");
|
|
4482
|
-
return new DeepgramVoice({ listeningModel: {
|
|
4483
|
-
name: entry.model,
|
|
4484
|
-
apiKey
|
|
4485
|
-
} });
|
|
4486
|
-
}
|
|
4487
|
-
const { OpenAIVoice } = await import("@mastra/voice-openai");
|
|
4488
|
-
return new OpenAIVoice({ listeningModel: {
|
|
4489
|
-
name: entry.model,
|
|
4490
|
-
apiKey,
|
|
4491
|
-
...entry.resolver === "openai-compatible" && entry.baseURL ? { options: { baseURL: entry.baseURL } } : {}
|
|
4492
|
-
} });
|
|
4493
|
-
}
|
|
4494
|
-
/**
|
|
4495
|
-
* Create a transcriber that reuses a single provider client across calls.
|
|
4496
|
-
* Resolves the provider/model and API key once up front (throwing
|
|
4497
|
-
* `VoiceCredentialError` if no key is available), so a session can build it on
|
|
4498
|
-
* start and call `transcribe()` per tick without re-resolving or reconnecting.
|
|
4499
|
-
*/
|
|
4500
|
-
function createTranscriber(options = {}) {
|
|
4501
|
-
const entry = resolveSTTModel(options.provider, options.model) ?? DEFAULT_STT_MODEL;
|
|
4502
|
-
const apiKey = resolveProviderApiKey(entry.provider, options.authStorage);
|
|
4432
|
+
/** Throws `VoiceCredentialError` up front when the provider has no key. */
|
|
4433
|
+
function createTranscriber(options) {
|
|
4434
|
+
const entry = resolveSTTModel(options.provider, options.model);
|
|
4435
|
+
const apiKey = resolveSTTApiKey(entry.provider, options.authStorage);
|
|
4503
4436
|
if (!apiKey) throw new VoiceCredentialError(entry.provider);
|
|
4504
|
-
const
|
|
4505
|
-
|
|
4437
|
+
const transcriber = createSTTTranscriber(entry, apiKey);
|
|
4438
|
+
transcriber.catch(() => {});
|
|
4506
4439
|
return { async transcribe(audio) {
|
|
4507
|
-
return
|
|
4440
|
+
return (await transcriber).transcribe(audio, "wav");
|
|
4508
4441
|
} };
|
|
4509
4442
|
}
|
|
4510
|
-
/**
|
|
4511
|
-
* Check whether a cloud STT provider has a usable API key, without recording.
|
|
4512
|
-
*/
|
|
4513
4443
|
function hasProviderCredential(provider, authStorage) {
|
|
4514
|
-
return
|
|
4515
|
-
}
|
|
4516
|
-
/**
|
|
4517
|
-
* `MastraVoice.listen()` returns a string for OpenAI-shaped transcription, but
|
|
4518
|
-
* other provider subclasses may return `{ transcript }` — normalize both.
|
|
4519
|
-
*/
|
|
4520
|
-
function normalizeTranscript(result) {
|
|
4521
|
-
if (typeof result === "string") return result.trim();
|
|
4522
|
-
if (result && typeof result === "object" && "transcript" in result) {
|
|
4523
|
-
const transcript = result.transcript;
|
|
4524
|
-
if (typeof transcript === "string") return transcript.trim();
|
|
4525
|
-
}
|
|
4526
|
-
return "";
|
|
4444
|
+
return resolveSTTApiKey(provider, authStorage) !== void 0;
|
|
4527
4445
|
}
|
|
4528
4446
|
// src/tui/commands/voice.ts
|
|
4529
4447
|
/**
|
|
@@ -12497,11 +12415,7 @@ var CloudSession = class {
|
|
|
12497
12415
|
constructor(recorder, options, callbacks) {
|
|
12498
12416
|
this.options = options;
|
|
12499
12417
|
this.callbacks = callbacks;
|
|
12500
|
-
this.transcriber = createTranscriber(
|
|
12501
|
-
provider: this.options.provider,
|
|
12502
|
-
model: this.options.model,
|
|
12503
|
-
authStorage: this.options.authStorage
|
|
12504
|
-
});
|
|
12418
|
+
this.transcriber = createTranscriber(this.options);
|
|
12505
12419
|
try {
|
|
12506
12420
|
this.recording = new MicRecording(recorder);
|
|
12507
12421
|
} catch {
|
|
@@ -12595,10 +12509,7 @@ var CloudSTTEngine = class {
|
|
|
12595
12509
|
}
|
|
12596
12510
|
checkReady() {
|
|
12597
12511
|
if (!detectRecorder()) return missingRecorderMessage();
|
|
12598
|
-
if (!hasProviderCredential(this.options.provider, this.options.authStorage))
|
|
12599
|
-
const env = this.options.provider === "openai" ? "OPENAI_API_KEY" : `${this.options.provider.toUpperCase()}_API_KEY`;
|
|
12600
|
-
return `Voice input needs a ${this.options.provider} API key. Set ${env} or add one with /api-keys.`;
|
|
12601
|
-
}
|
|
12512
|
+
if (!hasProviderCredential(this.options.provider, this.options.authStorage)) return voiceCredentialMessage(this.options.provider);
|
|
12602
12513
|
return null;
|
|
12603
12514
|
}
|
|
12604
12515
|
start(callbacks) {
|
|
@@ -28797,4 +28708,4 @@ var MastraTUI = class MastraTUI {
|
|
|
28797
28708
|
};
|
|
28798
28709
|
export { mastraBrand as C, closeActiveBrowser as D, activeBrowserGeneration as E, discardBrowser as O, mastra as S, TUI_CO_AUTHOR as T, normalizeThemePreference as _, formatUpdateHeader as a, getMarkdownTheme as b, LoginDialogComponent as c, createTUIState as d, UserMessageComponent as f, applyThemePreference as g, AssistantMessageComponent as h, formatUpToDate as i, replaceActiveBrowser as k, OMProgressComponent as l, ModelSelectorComponent as m, formatInstallingLabel as n, formatUpdateOutcome as o, ToolExecutionComponentEnhanced as p, formatRegistryError as r, LoginSelectorComponent as s, MastraTUI as t, formatOMStatus as u, applyThemeMode as v, theme as w, getThemeMode as x, getEditorTheme as y };
|
|
28799
28710
|
|
|
28800
|
-
//# sourceMappingURL=tui-
|
|
28711
|
+
//# sourceMappingURL=tui-Ba0GZdaT.js.map
|