@agentproto/adapter-mastracode 0.3.13 → 0.3.14
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/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -40,7 +40,8 @@ var mastracode = defineAgentCli({
|
|
|
40
40
|
bin_args: ["-y", "mastracode"],
|
|
41
41
|
install: [{ method: "npm", package: "mastracode", global: true }],
|
|
42
42
|
version_check: {
|
|
43
|
-
|
|
43
|
+
// PRESENCE probe — local (global npm tree), not a registry query.
|
|
44
|
+
cmd: "npm ls -g mastracode --depth=0",
|
|
44
45
|
parse: "(\\d+\\.\\d+\\.\\d+)",
|
|
45
46
|
range: ">=0.26.0",
|
|
46
47
|
timeout_ms: 15e3
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @agentproto/adapter-mastracode — AIP-45 adapter for Mastra Code.\n *\n * Mastra Code does not currently expose a discoverable ACP subcommand\n * (`mastracode acp --help` prints the top-level CLI help). We spawn\n * its documented headless CLI via `npx -y mastracode` and mark this\n * adapter as a print/headless protocol arm rather than claiming ACP.\n *\n * import { mastracode, mastracodeRuntime } from \"@agentproto/adapter-mastracode\"\n * const session = await mastracodeRuntime().start()\n * for await (const evt of session.send({ role: \"user\", content: \"...\" })) {\n * console.log(evt)\n * }\n * await session.close()\n */\n\nimport {\n createAgentCliRuntime,\n defineAgentCli,\n type AgentCliHandle,\n type AgentCliRuntime,\n} from \"@agentproto/driver-agent-cli\"\nimport { listModels } from \"@agentproto/model-catalog\"\nimport {\n deriveDeclaredCapabilities,\n type CapabilityStrategy,\n type ProviderCapability,\n} from \"@agentproto/provider-kit\"\n\n/**\n * Build mastracode's model menu from the shared provider catalog. Mastra Code\n * routes by the model id's own `<provider>/<id>` prefix, so every entry\n * carries the billing provider.\n *\n * Providers: Anthropic, OpenAI, OpenRouter, Google — matching models.env.\n */\nfunction buildMastracodeModelMenu(): Array<{ id: string; provider: string }> {\n const supported = [\n { provider: \"anthropic\", prefix: \"anthropic\" },\n { provider: \"openai\", prefix: \"openai\" },\n { provider: \"openrouter\", prefix: \"openrouter\" },\n { provider: \"google\", prefix: \"google\" },\n ] as const\n\n const seen = new Set<string>()\n const out: Array<{ id: string; provider: string }> = []\n\n for (const { provider, prefix } of supported) {\n for (const model of listModels({ kind: \"llm\", provider })) {\n const bareId = model.id\n const canonicalId = bareId.includes(\"/\") ? bareId : `${prefix}/${bareId}`\n const id = provider === \"openrouter\" ? `openrouter/${bareId}` : canonicalId\n if (seen.has(id)) continue\n seen.add(id)\n out.push({ id, provider })\n }\n }\n\n return out.sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider)\n return a.id.localeCompare(b.id)\n })\n}\n\nexport const mastracode: AgentCliHandle = defineAgentCli({\n name: \"mastracode\",\n id: \"mastracode\",\n description:\n \"Mastra Code — terminal-based AI coding agent with persistent threads, tools, modes, and multi-provider model support. Current CLI exposes TUI/headless operation, not ACP; spawned via `npx -y mastracode`.\",\n version: \"0.1.0\",\n bin: \"npx\",\n bin_args: [\"-y\", \"mastracode\"],\n install: [{ method: \"npm\", package: \"mastracode\", global: true }],\n version_check: {\n cmd: \"npm view mastracode version\",\n parse: \"(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\",\n range: \">=0.26.0\",\n timeout_ms: 15_000,\n },\n auth: {\n ref: \"./SECRETS.md\",\n state: {\n // The env names mastracode actually consults per provider. For Google it\n // is GOOGLE_API_KEY, not GOOGLE_GENERATIVE_AI_API_KEY: @mastra/core's\n // PROVIDER_REGISTRY.google.apiKeyEnvVar is the alias array\n // [\"GOOGLE_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\"], but @mastra/code-sdk\n // collapses it to envVars[0] (GOOGLE_API_KEY) before the env-key check.\n env: [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GOOGLE_API_KEY\",\n ],\n },\n },\n // Mastra Code's model router reads the provider straight off each id's own\n // `<provider>/<id>` prefix and consults the matching provider env var\n // (ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, …). There is no\n // fixed provider. Declaring this lets the runtime's billing-auth\n // resolver and catalog eligibility manifest include api-key profiles for the\n // model-derived direct endpoint.\n modelDerivedApiKey: true,\n // mastracode ships TWO independent native OAuth logins, each reached via\n // its TUI `/login` flow and stored in the CLI's own auth.json under its\n // app-data dir — the runtime declares one provider-scoped `authSubscription`\n // surface per login (see `subscriptionSurfaceFor` in `@agentproto/runtime`'s\n // spawn-defaults.ts, which resolves the matching entry for a spawn's\n // resolved provider). Both are EXTERNAL: the runtime injects no bearer —\n // an agentproto-held `sk-ant-oat…`/ChatGPT access token presented on\n // mastracode's x-api-key channel is rejected upstream as an invalid key,\n // so the ONLY working subscription path is the CLI's own login. Each\n // entry verifies its own login is present (fail-loud, via the\n // `mastracode` provision recipe's `anthropic-oauth`/`openai-oauth`\n // methods) and scrubs the matching api-key var so a leftover\n // ANTHROPIC_API_KEY/OPENAI_API_KEY can't override it.\n // - anthropic: `anthropicOAuthProvider` (Claude Pro/Max).\n // - openai: `openaiCodexOAuthProvider` (ChatGPT), stored under the\n // auth.json key `openai-codex` — verified against a live login.\n // Each is scoped to its own `provider`, so neither ever lights up the\n // other's (or openrouter/google's) models.\n authSubscription: [\n { external: true, provider: \"anthropic\" },\n { external: true, provider: \"openai\" },\n ],\n sandbox: \"./SANDBOX.md\",\n protocol: \"print\",\n print: {\n prompt_flag: \"--prompt\",\n output_format: [\"--output\", \"jsonl\"],\n pre_prompt: [],\n resume: { flag: \"--thread\", kind: \"value\" },\n event_schema: \"mastra-jsonl\",\n },\n session: {\n mode: \"ephemeral\",\n idle_timeout_ms: 1_800_000,\n context_carryover: false,\n },\n // Mastra's model router reads the provider straight off each id's own\n // `<provider>/<id>` prefix (no adapter mode), so the route falls out of the\n // chosen model — there is nothing independent to select → derived-from-model.\n routeSelection: \"derived-from-model\",\n models: {\n default: \"anthropic/claude-sonnet-4-5\",\n // Generated from the shared provider catalog so the Configuration Lab /\n // harness picker shows genuinely reachable Anthropic / OpenAI / OpenRouter\n // / Google models. The free-form `model` option still accepts any id.\n allowed: buildMastracodeModelMenu(),\n env: {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n // mastracode reads GOOGLE_API_KEY for `google` (see the auth.state.env\n // note above) — NOT GOOGLE_GENERATIVE_AI_API_KEY.\n google: \"GOOGLE_API_KEY\",\n },\n },\n capabilities: {\n streaming: true,\n tool_calls: true,\n sub_agents: true,\n file_io: true,\n multimodal: false,\n // `mastracode --thread <id>` reattaches to a prior thread with real\n // persisted memory (confirmed cross-process: separate spawn, same\n // thread id, correct continuity). `print.resume` below drives this.\n resumable: true,\n bidirectional: false,\n },\n modes: [\n {\n id: \"default\",\n description:\n \"Default headless mode. Mastra Code defaults to build mode when omitted.\",\n },\n {\n id: \"plan\",\n description:\n \"Plan-only mode — analyze architecture and propose implementation plans before writing code.\",\n bin_args_append: [\"--mode\", \"plan\"],\n },\n {\n id: \"build\",\n description:\n \"Build mode — file edits and shell commands use Mastra Code's configured permissions.\",\n bin_args_append: [\"--mode\", \"build\"],\n },\n {\n id: \"fast\",\n description: \"Fast mode — lower-latency answers and small edits.\",\n bin_args_append: [\"--mode\", \"fast\"],\n },\n ],\n options: [\n {\n id: \"model\",\n type: \"string\",\n description:\n \"Provider/model override for this operator binding (e.g. `anthropic/claude-sonnet-4-5`).\",\n bin_args_template: [\"--model\", \"{value}\"],\n },\n {\n id: \"thinking_level\",\n type: \"enum\",\n enum: [\"off\", \"low\", \"medium\", \"high\", \"xhigh\"],\n description: \"Thinking level passed to Mastra Code.\",\n bin_args_template: [\"--thinking-level\", \"{value}\"],\n },\n {\n id: \"timeout\",\n type: \"integer\",\n min: 1,\n max: 86_400,\n description: \"Maximum headless run duration in seconds.\",\n bin_args_template: [\"--timeout\", \"{value}\"],\n },\n ],\n continuation: {\n default: \"none\",\n supported: [\"none\", \"transcript\", \"native-resume\"],\n },\n metadata: {\n acp: {\n checked: \"2026-06-30\",\n result:\n \"`mastracode acp --help` prints top-level Mastra Code help; no ACP subcommand is currently discoverable.\",\n },\n lean: {\n checked: \"2026-07-03\",\n result:\n \"No `lean` mode declared. The headless entrypoint this adapter spawns \" +\n \"(runMCCli, driven by `--prompt`) has no flag to drop skill/subagent/OM \" +\n \"scaffolding, and does not read the MASTRACODE_DISABLE_MCP / \" +\n \"MASTRACODE_DISABLE_HOOKS / MASTRACODE_DISABLE_MEMORY env vars — those \" +\n \"are wired only into the interactive TUI entrypoint (tuiMain), so declaring \" +\n \"them here would silently do nothing. `--settings <path>` could point at a \" +\n \"leaner packaged settings.json, but that means shipping and maintaining an \" +\n \"actual settings file, not just a manifest patch — revisit if worth doing.\",\n },\n },\n tags: [\"mastracode\", \"mastra\", \"print\", \"agent-runtime\", \"coding\"],\n})\n\nexport function mastracodeRuntime(): AgentCliRuntime {\n return createAgentCliRuntime(mastracode)\n}\n\n/**\n * Mastra Code reads provider API keys straight from the ambient env per\n * `models.env` (ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, …).\n * There is no native creds/model-listing store to discover, so this stays on\n * the manifest-derived env-slot projection for `providers`/`models`/\n * `authStores`. It does enhance the provider list with the wire protocol each\n * direct route speaks, and it is honest that every route is api-key only —\n * Mastra Code has no Anthropic subscription bearer path.\n */\nfunction apiModeForProvider(id: string): ProviderCapability[\"apiMode\"] {\n if (id === \"anthropic\") return \"anthropic\"\n if (id === \"openai\" || id === \"openrouter\") return \"chat_completions\"\n return undefined\n}\n\nexport const mastracodeCapabilities: CapabilityStrategy = async (def, ctx) => {\n const base = deriveDeclaredCapabilities(def)\n const providers: ProviderCapability[] = base.providers.map((p) => ({\n ...p,\n apiMode: apiModeForProvider(p.id),\n cred: {\n ...p.cred,\n // The manifest already names the env var; reflect whether it is present\n // on this host without ever surfacing the value.\n present: !!ctx.env[p.cred.source.kind === \"env\" ? p.cred.source.var : \"\"],\n },\n }))\n return {\n ...base,\n source: \"discovered\",\n discoverable: \"live\",\n providers,\n application: { modelApply: \"arg\", postureApply: \"arg\", coupled: false },\n }\n}\n\nexport type { AgentCliHandle, AgentCliRuntime }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAoCA,SAAS,wBAAA,GAAoE;AAC3E,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,QAAA,EAAU,WAAA,EAAa,MAAA,EAAQ,WAAA,EAAY;AAAA,IAC7C,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS;AAAA,IACvC,EAAE,QAAA,EAAU,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAa;AAAA,IAC/C,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA;AAAS,GACzC;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAA+C,EAAC;AAEtD,EAAA,KAAA,MAAW,EAAE,QAAA,EAAU,MAAA,EAAO,IAAK,SAAA,EAAW;AAC5C,IAAA,KAAA,MAAW,SAAS,UAAA,CAAW,EAAE,MAAM,KAAA,EAAO,QAAA,EAAU,CAAA,EAAG;AACzD,MAAA,MAAM,SAAS,KAAA,CAAM,EAAA;AACrB,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,GAAG,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,QAAA,KAAa,YAAA,GAAe,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,GAAK,WAAA;AAChE,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,EAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,IAAI,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA,SAAiB,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA;AACzE,IAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,EAChC,CAAC,CAAA;AACH;AAEO,IAAM,aAA6B,cAAA,CAAe;AAAA,EACvD,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,WAAA,EACE,kNAAA;AAAA,EACF,OAAA,EAAS,OAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,QAAA,EAAU,CAAC,IAAA,EAAM,YAAY,CAAA;AAAA,EAC7B,OAAA,EAAS,CAAC,EAAE,MAAA,EAAQ,OAAO,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EAChE,aAAA,EAAe;AAAA;AAAA,IAEb,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,UAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAML,GAAA,EAAK;AAAA,QACH,mBAAA;AAAA,QACA,gBAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,EAAoB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpB,gBAAA,EAAkB;AAAA,IAChB,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA,IACxC,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,QAAA;AAAS,GACvC;AAAA,EACA,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,UAAA;AAAA,IACb,aAAA,EAAe,CAAC,UAAA,EAAY,OAAO,CAAA;AAAA,IACnC,YAAY,EAAC;AAAA,IACb,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,IAC1C,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,iBAAA,EAAmB;AAAA,GACrB;AAAA;AAAA;AAAA;AAAA,EAIA,cAAA,EAAgB,oBAAA;AAAA,EAChB,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,6BAAA;AAAA;AAAA;AAAA;AAAA,IAIT,SAAS,wBAAA,EAAyB;AAAA,IAClC,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,mBAAA;AAAA,MACX,MAAA,EAAQ,gBAAA;AAAA,MACR,UAAA,EAAY,oBAAA;AAAA;AAAA;AAAA,MAGZ,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,KAAA;AAAA;AAAA;AAAA;AAAA,IAIZ,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,KAAA,EAAO;AAAA,IACL;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,WAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,WAAA,EACE,kGAAA;AAAA,MACF,eAAA,EAAiB,CAAC,QAAA,EAAU,MAAM;AAAA,KACpC;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,WAAA,EACE,2FAAA;AAAA,MACF,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAO;AAAA,KACrC;AAAA,IACA;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,WAAA,EAAa,yDAAA;AAAA,MACb,eAAA,EAAiB,CAAC,QAAA,EAAU,MAAM;AAAA;AACpC,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EACE,yFAAA;AAAA,MACF,iBAAA,EAAmB,CAAC,SAAA,EAAW,SAAS;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,MAAM,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,MAC9C,WAAA,EAAa,uCAAA;AAAA,MACb,iBAAA,EAAmB,CAAC,kBAAA,EAAoB,SAAS;AAAA,KACnD;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,WAAA,EAAa,2CAAA;AAAA,MACb,iBAAA,EAAmB,CAAC,WAAA,EAAa,SAAS;AAAA;AAC5C,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,eAAe;AAAA,GACnD;AAAA,EACA,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EACE;AAAA,KACJ;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EACE;AAAA;AAQJ,GACF;AAAA,EACA,MAAM,CAAC,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,iBAAiB,QAAQ;AACnE,CAAC;AAEM,SAAS,iBAAA,GAAqC;AACnD,EAAA,OAAO,sBAAsB,UAAU,CAAA;AACzC;AAWA,SAAS,mBAAmB,EAAA,EAA2C;AACrE,EAAA,IAAI,EAAA,KAAO,aAAa,OAAO,WAAA;AAC/B,EAAA,IAAI,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,YAAA,EAAc,OAAO,kBAAA;AACnD,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,sBAAA,GAA6C,OAAO,GAAA,EAAK,GAAA,KAAQ;AAC5E,EAAA,MAAM,IAAA,GAAO,2BAA2B,GAAG,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAkC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACjE,GAAG,CAAA;AAAA,IACH,OAAA,EAAS,kBAAA,CAAmB,CAAA,CAAE,EAAE,CAAA;AAAA,IAChC,IAAA,EAAM;AAAA,MACJ,GAAG,CAAA,CAAE,IAAA;AAAA;AAAA;AAAA,MAGL,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE;AAAA;AAC1E,GACF,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAA,EAAQ,YAAA;AAAA,IACR,YAAA,EAAc,MAAA;AAAA,IACd,SAAA;AAAA,IACA,aAAa,EAAE,UAAA,EAAY,OAAO,YAAA,EAAc,KAAA,EAAO,SAAS,KAAA;AAAM,GACxE;AACF","file":"index.mjs","sourcesContent":["/**\n * @agentproto/adapter-mastracode — AIP-45 adapter for Mastra Code.\n *\n * Mastra Code does not currently expose a discoverable ACP subcommand\n * (`mastracode acp --help` prints the top-level CLI help). We spawn\n * its documented headless CLI via `npx -y mastracode` and mark this\n * adapter as a print/headless protocol arm rather than claiming ACP.\n *\n * import { mastracode, mastracodeRuntime } from \"@agentproto/adapter-mastracode\"\n * const session = await mastracodeRuntime().start()\n * for await (const evt of session.send({ role: \"user\", content: \"...\" })) {\n * console.log(evt)\n * }\n * await session.close()\n */\n\nimport {\n createAgentCliRuntime,\n defineAgentCli,\n type AgentCliHandle,\n type AgentCliRuntime,\n} from \"@agentproto/driver-agent-cli\"\nimport { listModels } from \"@agentproto/model-catalog\"\nimport {\n deriveDeclaredCapabilities,\n type CapabilityStrategy,\n type ProviderCapability,\n} from \"@agentproto/provider-kit\"\n\n/**\n * Build mastracode's model menu from the shared provider catalog. Mastra Code\n * routes by the model id's own `<provider>/<id>` prefix, so every entry\n * carries the billing provider.\n *\n * Providers: Anthropic, OpenAI, OpenRouter, Google — matching models.env.\n */\nfunction buildMastracodeModelMenu(): Array<{ id: string; provider: string }> {\n const supported = [\n { provider: \"anthropic\", prefix: \"anthropic\" },\n { provider: \"openai\", prefix: \"openai\" },\n { provider: \"openrouter\", prefix: \"openrouter\" },\n { provider: \"google\", prefix: \"google\" },\n ] as const\n\n const seen = new Set<string>()\n const out: Array<{ id: string; provider: string }> = []\n\n for (const { provider, prefix } of supported) {\n for (const model of listModels({ kind: \"llm\", provider })) {\n const bareId = model.id\n const canonicalId = bareId.includes(\"/\") ? bareId : `${prefix}/${bareId}`\n const id = provider === \"openrouter\" ? `openrouter/${bareId}` : canonicalId\n if (seen.has(id)) continue\n seen.add(id)\n out.push({ id, provider })\n }\n }\n\n return out.sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider)\n return a.id.localeCompare(b.id)\n })\n}\n\nexport const mastracode: AgentCliHandle = defineAgentCli({\n name: \"mastracode\",\n id: \"mastracode\",\n description:\n \"Mastra Code — terminal-based AI coding agent with persistent threads, tools, modes, and multi-provider model support. Current CLI exposes TUI/headless operation, not ACP; spawned via `npx -y mastracode`.\",\n version: \"0.1.0\",\n bin: \"npx\",\n bin_args: [\"-y\", \"mastracode\"],\n install: [{ method: \"npm\", package: \"mastracode\", global: true }],\n version_check: {\n // PRESENCE probe — local (global npm tree), not a registry query.\n cmd: \"npm ls -g mastracode --depth=0\",\n parse: \"(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\",\n range: \">=0.26.0\",\n timeout_ms: 15_000,\n },\n auth: {\n ref: \"./SECRETS.md\",\n state: {\n // The env names mastracode actually consults per provider. For Google it\n // is GOOGLE_API_KEY, not GOOGLE_GENERATIVE_AI_API_KEY: @mastra/core's\n // PROVIDER_REGISTRY.google.apiKeyEnvVar is the alias array\n // [\"GOOGLE_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\"], but @mastra/code-sdk\n // collapses it to envVars[0] (GOOGLE_API_KEY) before the env-key check.\n env: [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GOOGLE_API_KEY\",\n ],\n },\n },\n // Mastra Code's model router reads the provider straight off each id's own\n // `<provider>/<id>` prefix and consults the matching provider env var\n // (ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, …). There is no\n // fixed provider. Declaring this lets the runtime's billing-auth\n // resolver and catalog eligibility manifest include api-key profiles for the\n // model-derived direct endpoint.\n modelDerivedApiKey: true,\n // mastracode ships TWO independent native OAuth logins, each reached via\n // its TUI `/login` flow and stored in the CLI's own auth.json under its\n // app-data dir — the runtime declares one provider-scoped `authSubscription`\n // surface per login (see `subscriptionSurfaceFor` in `@agentproto/runtime`'s\n // spawn-defaults.ts, which resolves the matching entry for a spawn's\n // resolved provider). Both are EXTERNAL: the runtime injects no bearer —\n // an agentproto-held `sk-ant-oat…`/ChatGPT access token presented on\n // mastracode's x-api-key channel is rejected upstream as an invalid key,\n // so the ONLY working subscription path is the CLI's own login. Each\n // entry verifies its own login is present (fail-loud, via the\n // `mastracode` provision recipe's `anthropic-oauth`/`openai-oauth`\n // methods) and scrubs the matching api-key var so a leftover\n // ANTHROPIC_API_KEY/OPENAI_API_KEY can't override it.\n // - anthropic: `anthropicOAuthProvider` (Claude Pro/Max).\n // - openai: `openaiCodexOAuthProvider` (ChatGPT), stored under the\n // auth.json key `openai-codex` — verified against a live login.\n // Each is scoped to its own `provider`, so neither ever lights up the\n // other's (or openrouter/google's) models.\n authSubscription: [\n { external: true, provider: \"anthropic\" },\n { external: true, provider: \"openai\" },\n ],\n sandbox: \"./SANDBOX.md\",\n protocol: \"print\",\n print: {\n prompt_flag: \"--prompt\",\n output_format: [\"--output\", \"jsonl\"],\n pre_prompt: [],\n resume: { flag: \"--thread\", kind: \"value\" },\n event_schema: \"mastra-jsonl\",\n },\n session: {\n mode: \"ephemeral\",\n idle_timeout_ms: 1_800_000,\n context_carryover: false,\n },\n // Mastra's model router reads the provider straight off each id's own\n // `<provider>/<id>` prefix (no adapter mode), so the route falls out of the\n // chosen model — there is nothing independent to select → derived-from-model.\n routeSelection: \"derived-from-model\",\n models: {\n default: \"anthropic/claude-sonnet-4-5\",\n // Generated from the shared provider catalog so the Configuration Lab /\n // harness picker shows genuinely reachable Anthropic / OpenAI / OpenRouter\n // / Google models. The free-form `model` option still accepts any id.\n allowed: buildMastracodeModelMenu(),\n env: {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n // mastracode reads GOOGLE_API_KEY for `google` (see the auth.state.env\n // note above) — NOT GOOGLE_GENERATIVE_AI_API_KEY.\n google: \"GOOGLE_API_KEY\",\n },\n },\n capabilities: {\n streaming: true,\n tool_calls: true,\n sub_agents: true,\n file_io: true,\n multimodal: false,\n // `mastracode --thread <id>` reattaches to a prior thread with real\n // persisted memory (confirmed cross-process: separate spawn, same\n // thread id, correct continuity). `print.resume` below drives this.\n resumable: true,\n bidirectional: false,\n },\n modes: [\n {\n id: \"default\",\n description:\n \"Default headless mode. Mastra Code defaults to build mode when omitted.\",\n },\n {\n id: \"plan\",\n description:\n \"Plan-only mode — analyze architecture and propose implementation plans before writing code.\",\n bin_args_append: [\"--mode\", \"plan\"],\n },\n {\n id: \"build\",\n description:\n \"Build mode — file edits and shell commands use Mastra Code's configured permissions.\",\n bin_args_append: [\"--mode\", \"build\"],\n },\n {\n id: \"fast\",\n description: \"Fast mode — lower-latency answers and small edits.\",\n bin_args_append: [\"--mode\", \"fast\"],\n },\n ],\n options: [\n {\n id: \"model\",\n type: \"string\",\n description:\n \"Provider/model override for this operator binding (e.g. `anthropic/claude-sonnet-4-5`).\",\n bin_args_template: [\"--model\", \"{value}\"],\n },\n {\n id: \"thinking_level\",\n type: \"enum\",\n enum: [\"off\", \"low\", \"medium\", \"high\", \"xhigh\"],\n description: \"Thinking level passed to Mastra Code.\",\n bin_args_template: [\"--thinking-level\", \"{value}\"],\n },\n {\n id: \"timeout\",\n type: \"integer\",\n min: 1,\n max: 86_400,\n description: \"Maximum headless run duration in seconds.\",\n bin_args_template: [\"--timeout\", \"{value}\"],\n },\n ],\n continuation: {\n default: \"none\",\n supported: [\"none\", \"transcript\", \"native-resume\"],\n },\n metadata: {\n acp: {\n checked: \"2026-06-30\",\n result:\n \"`mastracode acp --help` prints top-level Mastra Code help; no ACP subcommand is currently discoverable.\",\n },\n lean: {\n checked: \"2026-07-03\",\n result:\n \"No `lean` mode declared. The headless entrypoint this adapter spawns \" +\n \"(runMCCli, driven by `--prompt`) has no flag to drop skill/subagent/OM \" +\n \"scaffolding, and does not read the MASTRACODE_DISABLE_MCP / \" +\n \"MASTRACODE_DISABLE_HOOKS / MASTRACODE_DISABLE_MEMORY env vars — those \" +\n \"are wired only into the interactive TUI entrypoint (tuiMain), so declaring \" +\n \"them here would silently do nothing. `--settings <path>` could point at a \" +\n \"leaner packaged settings.json, but that means shipping and maintaining an \" +\n \"actual settings file, not just a manifest patch — revisit if worth doing.\",\n },\n },\n tags: [\"mastracode\", \"mastra\", \"print\", \"agent-runtime\", \"coding\"],\n})\n\nexport function mastracodeRuntime(): AgentCliRuntime {\n return createAgentCliRuntime(mastracode)\n}\n\n/**\n * Mastra Code reads provider API keys straight from the ambient env per\n * `models.env` (ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, …).\n * There is no native creds/model-listing store to discover, so this stays on\n * the manifest-derived env-slot projection for `providers`/`models`/\n * `authStores`. It does enhance the provider list with the wire protocol each\n * direct route speaks, and it is honest that every route is api-key only —\n * Mastra Code has no Anthropic subscription bearer path.\n */\nfunction apiModeForProvider(id: string): ProviderCapability[\"apiMode\"] {\n if (id === \"anthropic\") return \"anthropic\"\n if (id === \"openai\" || id === \"openrouter\") return \"chat_completions\"\n return undefined\n}\n\nexport const mastracodeCapabilities: CapabilityStrategy = async (def, ctx) => {\n const base = deriveDeclaredCapabilities(def)\n const providers: ProviderCapability[] = base.providers.map((p) => ({\n ...p,\n apiMode: apiModeForProvider(p.id),\n cred: {\n ...p.cred,\n // The manifest already names the env var; reflect whether it is present\n // on this host without ever surfacing the value.\n present: !!ctx.env[p.cred.source.kind === \"env\" ? p.cred.source.var : \"\"],\n },\n }))\n return {\n ...base,\n source: \"discovered\",\n discoverable: \"live\",\n providers,\n application: { modelApply: \"arg\", postureApply: \"arg\", coupled: false },\n }\n}\n\nexport type { AgentCliHandle, AgentCliRuntime }\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentproto/adapter-mastracode",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.14",
|
|
4
4
|
"description": "@agentproto/adapter-mastracode — AIP-45 AGENT-CLI adapter for Mastra Code. Spawns the documented headless CLI via `npx -y mastracode`; current Mastra Code does not expose a discoverable ACP subcommand.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentproto",
|