@hugo.bastidas/minimax-plugin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/.claude-plugin/plugin.json +13 -0
  2. package/.mcp.json +3 -0
  3. package/AGENTS.md +37 -0
  4. package/README.md +263 -0
  5. package/codex-plugin.toml +3 -0
  6. package/dist/artifacts/metadata.d.ts +3 -0
  7. package/dist/artifacts/metadata.d.ts.map +1 -0
  8. package/dist/artifacts/metadata.js +8 -0
  9. package/dist/artifacts/metadata.js.map +1 -0
  10. package/dist/artifacts/runs.d.ts +27 -0
  11. package/dist/artifacts/runs.d.ts.map +1 -0
  12. package/dist/artifacts/runs.js +43 -0
  13. package/dist/artifacts/runs.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +31 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/client/anthropic.d.ts +3 -0
  19. package/dist/client/anthropic.d.ts.map +1 -0
  20. package/dist/client/anthropic.js +31 -0
  21. package/dist/client/anthropic.js.map +1 -0
  22. package/dist/client/minimax.d.ts +19 -0
  23. package/dist/client/minimax.d.ts.map +1 -0
  24. package/dist/client/minimax.js +16 -0
  25. package/dist/client/minimax.js.map +1 -0
  26. package/dist/client/openai.d.ts +3 -0
  27. package/dist/client/openai.d.ts.map +1 -0
  28. package/dist/client/openai.js +28 -0
  29. package/dist/client/openai.js.map +1 -0
  30. package/dist/config.d.ts +14 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +34 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/hooks/claude-routing-reminder.d.ts +2 -0
  35. package/dist/hooks/claude-routing-reminder.d.ts.map +1 -0
  36. package/dist/hooks/claude-routing-reminder.js +12 -0
  37. package/dist/hooks/claude-routing-reminder.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +8 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/install/claude-config.d.ts +15 -0
  43. package/dist/install/claude-config.d.ts.map +1 -0
  44. package/dist/install/claude-config.js +130 -0
  45. package/dist/install/claude-config.js.map +1 -0
  46. package/dist/install/codex-config.d.ts +11 -0
  47. package/dist/install/codex-config.d.ts.map +1 -0
  48. package/dist/install/codex-config.js +83 -0
  49. package/dist/install/codex-config.js.map +1 -0
  50. package/dist/install/global-instructions.d.ts +9 -0
  51. package/dist/install/global-instructions.d.ts.map +1 -0
  52. package/dist/install/global-instructions.js +90 -0
  53. package/dist/install/global-instructions.js.map +1 -0
  54. package/dist/install/index.d.ts +6 -0
  55. package/dist/install/index.d.ts.map +1 -0
  56. package/dist/install/index.js +6 -0
  57. package/dist/install/index.js.map +1 -0
  58. package/dist/install/native-multimodal-config.d.ts +4 -0
  59. package/dist/install/native-multimodal-config.d.ts.map +1 -0
  60. package/dist/install/native-multimodal-config.js +50 -0
  61. package/dist/install/native-multimodal-config.js.map +1 -0
  62. package/dist/install/opencode-config.d.ts +13 -0
  63. package/dist/install/opencode-config.d.ts.map +1 -0
  64. package/dist/install/opencode-config.js +65 -0
  65. package/dist/install/opencode-config.js.map +1 -0
  66. package/dist/install/shell-alias.d.ts +9 -0
  67. package/dist/install/shell-alias.d.ts.map +1 -0
  68. package/dist/install/shell-alias.js +86 -0
  69. package/dist/install/shell-alias.js.map +1 -0
  70. package/dist/server.d.ts +3 -0
  71. package/dist/server.d.ts.map +1 -0
  72. package/dist/server.js +125 -0
  73. package/dist/server.js.map +1 -0
  74. package/dist/tools/ask.d.ts +18 -0
  75. package/dist/tools/ask.d.ts.map +1 -0
  76. package/dist/tools/ask.js +18 -0
  77. package/dist/tools/ask.js.map +1 -0
  78. package/dist/tools/delegate.d.ts +15 -0
  79. package/dist/tools/delegate.d.ts.map +1 -0
  80. package/dist/tools/delegate.js +31 -0
  81. package/dist/tools/delegate.js.map +1 -0
  82. package/dist/tools/inspect-run.d.ts +10 -0
  83. package/dist/tools/inspect-run.d.ts.map +1 -0
  84. package/dist/tools/inspect-run.js +23 -0
  85. package/dist/tools/inspect-run.js.map +1 -0
  86. package/dist/tools/mmx-cli.d.ts +92 -0
  87. package/dist/tools/mmx-cli.d.ts.map +1 -0
  88. package/dist/tools/mmx-cli.js +211 -0
  89. package/dist/tools/mmx-cli.js.map +1 -0
  90. package/dist/tools/model-status.d.ts +8 -0
  91. package/dist/tools/model-status.d.ts.map +1 -0
  92. package/dist/tools/model-status.js +28 -0
  93. package/dist/tools/model-status.js.map +1 -0
  94. package/dist/tools/propose-patch.d.ts +14 -0
  95. package/dist/tools/propose-patch.d.ts.map +1 -0
  96. package/dist/tools/propose-patch.js +26 -0
  97. package/dist/tools/propose-patch.js.map +1 -0
  98. package/dist/tools/review-diff.d.ts +14 -0
  99. package/dist/tools/review-diff.d.ts.map +1 -0
  100. package/dist/tools/review-diff.js +52 -0
  101. package/dist/tools/review-diff.js.map +1 -0
  102. package/dist/tools/summarize.d.ts +13 -0
  103. package/dist/tools/summarize.d.ts.map +1 -0
  104. package/dist/tools/summarize.js +28 -0
  105. package/dist/tools/summarize.js.map +1 -0
  106. package/dist/usage/stats.d.ts +34 -0
  107. package/dist/usage/stats.d.ts.map +1 -0
  108. package/dist/usage/stats.js +201 -0
  109. package/dist/usage/stats.js.map +1 -0
  110. package/dist/usage/tool-usage.d.ts +11 -0
  111. package/dist/usage/tool-usage.d.ts.map +1 -0
  112. package/dist/usage/tool-usage.js +24 -0
  113. package/dist/usage/tool-usage.js.map +1 -0
  114. package/dist/validation/limits.d.ts +8 -0
  115. package/dist/validation/limits.d.ts.map +1 -0
  116. package/dist/validation/limits.js +8 -0
  117. package/dist/validation/limits.js.map +1 -0
  118. package/dist/validation/patch.d.ts +7 -0
  119. package/dist/validation/patch.d.ts.map +1 -0
  120. package/dist/validation/patch.js +20 -0
  121. package/dist/validation/patch.js.map +1 -0
  122. package/dist/workspace/collect-files.d.ts +19 -0
  123. package/dist/workspace/collect-files.d.ts.map +1 -0
  124. package/dist/workspace/collect-files.js +60 -0
  125. package/dist/workspace/collect-files.js.map +1 -0
  126. package/dist/workspace/ignore.d.ts +3 -0
  127. package/dist/workspace/ignore.d.ts.map +1 -0
  128. package/dist/workspace/ignore.js +13 -0
  129. package/dist/workspace/ignore.js.map +1 -0
  130. package/dist/workspace/paths.d.ts +3 -0
  131. package/dist/workspace/paths.d.ts.map +1 -0
  132. package/dist/workspace/paths.js +18 -0
  133. package/dist/workspace/paths.js.map +1 -0
  134. package/dist/workspace/secrets.d.ts +4 -0
  135. package/dist/workspace/secrets.d.ts.map +1 -0
  136. package/dist/workspace/secrets.js +32 -0
  137. package/dist/workspace/secrets.js.map +1 -0
  138. package/package.json +64 -0
  139. package/scripts/claude-config.mjs +3 -0
  140. package/scripts/codex-config.mjs +3 -0
  141. package/scripts/install.mjs +548 -0
  142. package/scripts/opencode-config.mjs +3 -0
  143. package/skills/minimax-delegation/SKILL.md +24 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "minimax-plugin",
3
+ "version": "0.1.0",
4
+ "description": "MiniMax M2.7 delegation plugin for Claude Code",
5
+ "author": "Hugo Bastidas",
6
+ "mcpServers": {
7
+ "minimax": {
8
+ "command": "node",
9
+ "args": ["${CLAUDE_PLUGIN_ROOT}/dist/index.js"],
10
+ "env": {}
11
+ }
12
+ }
13
+ }
package/.mcp.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "mcpServers": {}
3
+ }
package/AGENTS.md ADDED
@@ -0,0 +1,37 @@
1
+ # Instrucciones para el agente — minimax-plugin
2
+
3
+ ## Propósito
4
+
5
+ Plugin MCP que permite a agentes host (Claude Code, Codex, OpenCode) delegar tareas
6
+ pesadas en tokens a MiniMax M3. El servidor lee archivos del workspace localmente,
7
+ envía solo el contexto necesario a MiniMax y almacena salidas pesadas como artefactos
8
+ locales. El agente host recibe resúmenes compactos en lugar de la salida completa.
9
+
10
+ ## Stack
11
+
12
+ - TypeScript · Node.js · `@modelcontextprotocol/sdk`
13
+ - Validación de entrada: `zod`
14
+ - Tests: `vitest`
15
+ - Build: `tsc`
16
+
17
+ ## Comandos
18
+
19
+ ```bash
20
+ npm install # instalar dependencias
21
+ npm run build # compilar TypeScript → dist/
22
+ npm test # correr suite de tests
23
+ npm run typecheck # verificar tipos sin compilar
24
+ npm run setup # instalador interactivo (hosts: Claude Code, Codex, OpenCode)
25
+ minimax gain # ver estadísticas de uso y ahorro de tokens
26
+ ```
27
+
28
+ ## Reglas específicas del proyecto
29
+
30
+ - No registrar el `minimax-mcp` oficial nativo; este plugin expone las herramientas
31
+ `mmx_*` que invocan el CLI `mmx` oficial a través de wrappers en `src/tools/mmx-cli.ts`.
32
+ - Los artefactos de runs se almacenan en `.minimax/runs/<timestamp>-<slug>/` y están
33
+ excluidos de git. Usar `inspect_run` para recuperarlos bajo demanda.
34
+ - No pegar artefactos completos de vuelta en el contexto host salvo que sea
35
+ estrictamente necesario.
36
+ - Validar siempre que las propuestas de MiniMax cumplan los requisitos del proyecto
37
+ antes de aplicar cualquier parche.
package/README.md ADDED
@@ -0,0 +1,263 @@
1
+ # minimax-plugin
2
+
3
+ Plugin de delegación MCP para MiniMax M3 — compatible con Claude Code, Codex y OpenCode.
4
+
5
+ ## Qué hace
6
+
7
+ Este plugin permite a los agentes host (Claude Code, Codex, OpenCode) delegar tareas
8
+ pesadas en tokens a MiniMax M3 a través de un servidor MCP. El servidor lee archivos
9
+ del workspace localmente, envía solo el contexto necesario a MiniMax y almacena las
10
+ salidas pesadas como artefactos locales. Los agentes host reciben resúmenes compactos,
11
+ no la salida completa sin procesar.
12
+
13
+ **Por qué ahorra tokens:** en lugar de que el host lea muchos archivos en su contexto,
14
+ pegue diffs extensos o procese logs largos, el servidor MCP lo hace localmente y devuelve
15
+ solo lo que el host necesita.
16
+
17
+ ## Instalación
18
+
19
+ ```bash
20
+ # Instalar dependencias y compilar
21
+ npm install
22
+ npm run build
23
+
24
+ # Instalador interactivo (soporta Claude Code, Codex, OpenCode)
25
+ npm run setup
26
+
27
+ # Tras la instalación global o como link, ver estadísticas de ahorro
28
+ minimax gain
29
+ ```
30
+
31
+ El menú del instalador tiene cuatro acciones: **Install**, **Update**, **Uninstall** y
32
+ **Status**. Al elegir **Install** (o **Update**) y uno o más hosts destino (Claude Code,
33
+ Codex, OpenCode — seleccionados con espacio en multiselect), muestra un selector de
34
+ componentes:
35
+
36
+ - **Core MCP** — MCP de codificación/delegación, herramientas wrapper de `mmx` CLI,
37
+ enrutamiento `MINIMAX.md` y hooks de Claude Code
38
+ - **Superpowers routing** — `MINIMAX_SUPERPOWERS.md` (depende de Core; se autoselecciona)
39
+ - **MiniMax CLI (mmx)** — CLI oficial `mmx` instalado globalmente (autoseleccionado por Core MCP)
40
+
41
+ **Alias de shell** — el instalador puede agregar una función de shell (por defecto: `cc-mini`)
42
+ que lanza Claude Code apuntando a la API de MiniMax. El alias escribe las credenciales en el
43
+ archivo RC de la shell con protección `chmod 0o600`, asegurando que la API key solo sea
44
+ legible por el propietario.
45
+
46
+ Cuando algún componente seleccionado requiere credenciales, el instalador solicita:
47
+
48
+ - `MINIMAX_API_KEY` (obligatorio)
49
+ - `MINIMAX_API_MODE` (por defecto: `anthropic`)
50
+ - `MINIMAX_MODEL` (por defecto: `MiniMax-M3`; el instalador lista los modelos MiniMax-M
51
+ disponibles en la cuenta y excluye variantes `highspeed`)
52
+
53
+ ### Configuración manual
54
+
55
+ **Claude Code** — agregar a `~/.claude.json`:
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "minimax": {
61
+ "command": "node",
62
+ "args": ["/ruta/a/minimax-plugin/dist/index.js"],
63
+ "env": {
64
+ "MINIMAX_API_KEY": "sk-...",
65
+ "MINIMAX_API_MODE": "anthropic",
66
+ "MINIMAX_MODEL": "MiniMax-M3"
67
+ }
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ **OpenCode** — agregar a `~/.config/opencode/opencode.jsonc`:
74
+
75
+ ```json
76
+ {
77
+ "mcp": {
78
+ "minimax": {
79
+ "type": "local",
80
+ "command": ["node", "/ruta/a/minimax-plugin/dist/index.js"],
81
+ "enabled": true,
82
+ "environment": {
83
+ "MINIMAX_API_KEY": "sk-...",
84
+ "MINIMAX_API_MODE": "anthropic",
85
+ "MINIMAX_MODEL": "MiniMax-M3"
86
+ }
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
92
+ **Codex** — agregar a `~/.codex/config.toml`:
93
+
94
+ ```toml
95
+ [mcp_servers.minimax]
96
+ command = "node"
97
+ args = ["/ruta/a/minimax-plugin/dist/index.js"]
98
+
99
+ [mcp_servers.minimax.env]
100
+ MINIMAX_API_KEY = "sk-..."
101
+ MINIMAX_API_MODE = "anthropic"
102
+ MINIMAX_MODEL = "MiniMax-M3"
103
+ ```
104
+
105
+ ## Desinstalación
106
+
107
+ ```bash
108
+ npm run setup
109
+ # Seleccionar "Uninstall"
110
+ ```
111
+
112
+ Elegir **Uninstall** y un host (o **All**); el instalador lista solo los componentes
113
+ instalados actualmente y permite seleccionar cuáles remover. Eliminar **Core MCP** también
114
+ elimina el MCP de codificación/delegación, las referencias de enrutamiento, los sidecars
115
+ generados (`MINIMAX.md` y `MINIMAX_SUPERPOWERS.md`) y los hooks de Claude Code donde
116
+ corresponda. También es posible remover manualmente la entrada `minimax` del archivo de
117
+ configuración del host.
118
+
119
+ ## Estadísticas del CLI global
120
+
121
+ El paquete expone un comando global `minimax` cuando se instala o enlaza como paquete npm.
122
+ Úsalo para inspeccionar el uso del MCP y el ahorro de tokens, similar a `rtk gain`:
123
+
124
+ ```bash
125
+ minimax gain
126
+ ```
127
+
128
+ El MCP agrega registros de uso en `~/.minimax/usage.jsonl` por defecto. Se puede
129
+ sobreescribir con `MINIMAX_USAGE_FILE=/ruta/al/archivo.jsonl`. El reporte muestra llamadas
130
+ totales, tokens de entrada/salida reportados por MiniMax, tokens compactos devueltos al host,
131
+ ahorro estimado, tiempo de ejecución e impacto por herramienta.
132
+
133
+ ## Variables de entorno
134
+
135
+ | Variable | Requerida | Por defecto | Descripción |
136
+ |---|---|---|---|
137
+ | `MINIMAX_API_KEY` | Sí | — | API key de MiniMax |
138
+ | `MINIMAX_API_MODE` | No | `anthropic` | Modo de API: `anthropic` o `openai` |
139
+ | `MINIMAX_MODEL` | No | `MiniMax-M3` | Nombre del modelo; el instalador obtiene los modelos MiniMax-M disponibles en la cuenta y excluye variantes `highspeed` |
140
+ | `MINIMAX_BASE_URL` | No | Según modo | URL base alternativa |
141
+ | `MINIMAX_TIMEOUT_MS` | No | `300000` | Timeout de solicitud en milisegundos |
142
+ | `MINIMAX_MAX_OUTPUT_TOKENS` | No | `16384` | Máximo de tokens de salida por solicitud |
143
+ | `MINIMAX_SERVICE_TIER` | No | — | Tier de servicio MiniMax opcional: `standard` o `priority` |
144
+ | `MINIMAX_ARTIFACT_DIR` | No | `.minimax/runs` | Directorio local de almacenamiento de artefactos |
145
+ | `MINIMAX_USAGE_FILE` | No | `~/.minimax/usage.jsonl` | Log de uso/estadísticas del MCP |
146
+
147
+ ## Referencias de enrutamiento global y hooks de Claude Code
148
+
149
+ Al instalar para Claude Code, Codex u OpenCode, el instalador mantiene pequeños los archivos
150
+ de instrucciones globales del host. El componente **Core MCP** escribe la política de
151
+ enrutamiento en `MINIMAX.md` e inserta solo una referencia gestionada por el plugin
152
+ `@.../MINIMAX.md` en el archivo de instrucciones globales del host. El componente opcional
153
+ **Superpowers routing** escribe `MINIMAX_SUPERPOWERS.md` e inserta solo una referencia
154
+ gestionada `@.../MINIMAX_SUPERPOWERS.md`:
155
+
156
+ - Claude Code: referencias en `~/.claude/CLAUDE.md`, políticas en `~/.claude/MINIMAX.md`
157
+ y opcionalmente `~/.claude/MINIMAX_SUPERPOWERS.md`
158
+ - Codex: referencias en `~/.codex/AGENTS.md`, políticas en `~/.codex/MINIMAX.md`
159
+ y opcionalmente `~/.codex/MINIMAX_SUPERPOWERS.md`
160
+ - OpenCode: referencias en `~/.config/opencode/AGENTS.md`, políticas en
161
+ `~/.config/opencode/MINIMAX.md` y opcionalmente `~/.config/opencode/MINIMAX_SUPERPOWERS.md`
162
+
163
+ Las rutas se derivan del directorio home/config del usuario actual en tiempo de instalación;
164
+ el instalador no hardcodea un nombre de usuario ni una ruta `/Users/...`. Las políticas de
165
+ MiniMax están escritas en segunda persona para funcionar de forma independiente para
166
+ cualquier host: **el agente host sigue siendo el orquestador y la autoridad final**. MiniMax
167
+ está enmarcado como un trabajador acotado para resúmenes de contexto pesado, borradores de
168
+ implementación, refactors mecánicos, actualizaciones de docs, scaffolds de tests, boilerplate
169
+ de migraciones, variantes de copy para landing pages, scaffolding repetitivo de componentes
170
+ y revisiones de diff opcionales como segunda opinión.
171
+
172
+ El menú del instalador usa cuatro acciones (**Install**, **Update**, **Uninstall**, **Status**)
173
+ con indicaciones. Después de elegir **Install** o **Update** y un host, un selector multiselect
174
+ lista todos los componentes — Core MCP, Superpowers routing y el CLI `mmx`
175
+ oficial — para que cada componente tenga exactamente un lugar donde gestionarlo. Las
176
+ dependencias se resuelven automáticamente (seleccionar Superpowers también selecciona Core).
177
+ Las convenciones globales personales (`AGENT_FOUNDATION.md`) se gestionan con el paquete
178
+ independiente `@hugo.bastidas/agent-foundation`, no con este instalador.
179
+ Los archivos `AGENTS.md` locales de cada proyecto deben mantenerse específicos del proyecto
180
+ y no deben duplicar reglas globales de sidecars como `AGENT_FOUNDATION.md`, `RTK.md`,
181
+ `MINIMAX.md` u otras referencias del host.
182
+
183
+ La política opcional de Superpowers indica al host que cuando un plan de Superpowers ofrece
184
+ Subagent-Driven Development y `superpowers_execute_task` está disponible, MiniMax debe ejecutar
185
+ cada tarea planeada internamente como implementador + revisor de spec + revisor de calidad de
186
+ código + sintetizador de parche final. Claude/Codex mantiene el brainstorming, specs, planes,
187
+ aplicación de parches, ejecución de tests y revisión final.
188
+
189
+ La API de texto está ajustada para MiniMax M3: las herramientas worker de contexto largo usan
190
+ thinking habilitado, mientras que el modo rápido `ask_minimax` lo deshabilita para menor
191
+ latencia. Las llamadas compatibles con Anthropic envían `thinking: { "type": "enabled" }`
192
+ cuando thinking está habilitado; las compatibles con OpenAI envían
193
+ `extra_body.reasoning_split = true` cuando se requiere salida de razonamiento. Establecer
194
+ `MINIMAX_SERVICE_TIER=priority` solo cuando la cuenta MiniMax soporta el tier priority.
195
+
196
+ El instalador no registra el servidor `minimax-mcp` oficial nativo. En su lugar, el Core MCP
197
+ expone herramientas `mmx_*` que llaman al CLI `mmx` oficial para operaciones de medios,
198
+ búsqueda, visión, cuota, config y archivos. El componente CLI opcional usa
199
+ `npm install -g mmx-cli` y provee el comando `mmx` para uso directo en terminal también.
200
+
201
+ Para Claude Code, el instalador agrega también hooks `SessionStart` y `UserPromptSubmit`
202
+ gestionados por el plugin en `~/.claude/settings.json`. El hook no hardcodea nombres de
203
+ herramientas de MiniMax; recuerda a Claude que inspeccione las herramientas actualmente
204
+ disponibles expuestas por el servidor MCP `minimax` y use MiniMax solo cuando la tarea
205
+ se ajuste a la política de trabajador acotado. La planificación, arquitectura, depuración,
206
+ revisión final, verificación y autoridad permanecen con el agente host.
207
+
208
+ ## Herramientas
209
+
210
+ | Herramienta | Descripción |
211
+ |---|---|
212
+ | `ask_minimax` | Consultar a MiniMax sin necesidad de acceso a archivos locales; el modo rápido deshabilita thinking por defecto, los modos más profundos lo habilitan |
213
+ | `delegate_task` | Delegar tareas de worker de implementación acotada con perfiles limitados: implementation, mechanical_refactor, docs_update, test_scaffold, migration_boilerplate |
214
+ | `summarize_context` | Resumir archivos o directorios locales — resúmenes de arquitectura, riesgo u onboarding |
215
+ | `review_diff` | Segunda opinión opcional en un diff; el host sigue siendo el revisor final |
216
+ | `propose_patch` | Pedir a MiniMax que proponga un parche — se almacena como artefacto, NO se aplica directamente |
217
+ | `inspect_run` | Inspeccionar metadatos o artefactos de un run anterior |
218
+ | `model_status` | Verificar configuración y conectividad con la API |
219
+ | `superpowers_execute_task` | Ejecutar una tarea de plan Superpowers usando MiniMax como implementador interno, revisor de spec, revisor de calidad y sintetizador de parche final; almacena artefactos para revisión del host |
220
+ | `git_commit` | Generar un mensaje Conventional Commits a partir de git diff — MiniMax responde solo en español |
221
+ | `mmx_cli_status` / `mmx_quota_show` / `mmx_config_show` | Inspeccionar el CLI `mmx` instalado, cuotas y configuración |
222
+ | `mmx_text_chat` | Ejecutar chat de texto de MiniMax a través del CLI `mmx` oficial |
223
+ | `mmx_speech_voices` / `mmx_speech_synthesize` | Listar voces y sintetizar voz a través de `mmx` |
224
+ | `mmx_image_generate` | Generar imágenes a través de `mmx`; las rutas generadas permanecen dentro del workspace |
225
+ | `mmx_music_generate` / `mmx_music_cover` | Generar música o portadas a través de `mmx` |
226
+ | `mmx_search_query` / `mmx_vision_describe` | Búsqueda web y comprensión de imágenes a través del CLI de MiniMax |
227
+ | `mmx_file_list` | Listar el almacenamiento de archivos de MiniMax a través de `mmx` |
228
+
229
+ ## Directorio de artefactos
230
+
231
+ Todas las salidas pesadas se almacenan en `.minimax/runs/<timestamp>-<slug>/`:
232
+
233
+ - `metadata.json` — metadatos del run
234
+ - `report.md` — informe de análisis completo
235
+ - `request.json` — detalles de la solicitud y manifiesto de archivos
236
+ - `summary.md` — resumen compacto
237
+ - `patch.diff` — parches propuestos (no aplicados)
238
+ - `implementation.md`, `spec-review.md`, `quality-review.md`, `final-patch.md` — artefactos de ejecución de tareas Superpowers
239
+
240
+ `.minimax/runs` está en `.gitignore` por defecto. Usar `inspect_run` para recuperar artefactos cuando sea necesario.
241
+
242
+ ## Modelo de seguridad
243
+
244
+ - Todas las rutas se validan para permanecer dentro de la raíz del workspace
245
+ - Las herramientas wrapper `mmx_*` pasan la API key a través del flag oficial `mmx --api-key`
246
+ porque el CLI no consume `MINIMAX_API_KEY` del entorno; los ecos de comandos redactan la key
247
+ como `[redacted]`
248
+ - `.git`, `node_modules`, `dist` y archivos dot-env están bloqueados por defecto
249
+ - Los patrones de secretos (API keys, tokens, contraseñas, claves privadas) se redactan antes
250
+ de enviar a MiniMax
251
+ - Los parches propuestos se validan: sin rutas `.git`, sin traversal de directorios padre,
252
+ sin escritura directa de archivos
253
+ - MiniMax nunca escribe archivos directamente — los parches se almacenan como artefactos para
254
+ revisión del host
255
+
256
+ ## Desarrollo
257
+
258
+ ```bash
259
+ npm install
260
+ npm test
261
+ npm run typecheck
262
+ npm run build
263
+ ```
@@ -0,0 +1,3 @@
1
+ name = "minimax-plugin"
2
+ version = "0.1.0"
3
+ description = "Delegate token-heavy work to MiniMax M2.7 through MCP"
@@ -0,0 +1,3 @@
1
+ export declare function sha256(content: string | Buffer): string;
2
+ export declare function safeSlug(value: string): string;
3
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/artifacts/metadata.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,8 @@
1
+ import { createHash } from 'node:crypto';
2
+ export function sha256(content) {
3
+ return createHash('sha256').update(content).digest('hex');
4
+ }
5
+ export function safeSlug(value) {
6
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 60) || 'run';
7
+ }
8
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/artifacts/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,MAAM,CAAC,OAAwB;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;AACrG,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface RunMetadata {
2
+ runId: string;
3
+ tool: string;
4
+ createdAt: string;
5
+ artifacts: Record<string, {
6
+ path: string;
7
+ sha256: string;
8
+ bytes: number;
9
+ }>;
10
+ }
11
+ export interface RunHandle {
12
+ runId: string;
13
+ runDir: string;
14
+ metadata: RunMetadata;
15
+ }
16
+ export declare function createRun(input: {
17
+ artifactRoot: string;
18
+ slug: string;
19
+ tool: string;
20
+ }): Promise<RunHandle>;
21
+ export declare function writeRunArtifact(run: RunHandle, name: string, content: string): Promise<{
22
+ path: string;
23
+ sha256: string;
24
+ bytes: number;
25
+ }>;
26
+ export declare function readRunMetadata(runDir: string): Promise<RunMetadata>;
27
+ //# sourceMappingURL=runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/artifacts/runs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAY/G;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ9I;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAE1E"}
@@ -0,0 +1,43 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { isAbsolute, join, resolve } from 'node:path';
4
+ import { safeSlug, sha256 } from './metadata.js';
5
+ export async function createRun(input) {
6
+ const createdAt = new Date().toISOString();
7
+ const stamp = createdAt.replace(/[:.]/g, '-');
8
+ const runId = `${stamp}-${safeSlug(input.slug)}-${randomBytes(4).toString('hex')}`;
9
+ const artifactRoot = resolve(input.artifactRoot);
10
+ const runDir = join(artifactRoot, runId);
11
+ await mkdir(artifactRoot, { recursive: true });
12
+ await mkdir(runDir);
13
+ const metadata = { runId, tool: input.tool, createdAt, artifacts: {} };
14
+ const handle = { runId, runDir, metadata };
15
+ await persistMetadata(handle);
16
+ return handle;
17
+ }
18
+ export async function writeRunArtifact(run, name, content) {
19
+ assertSafeArtifactName(name);
20
+ const path = join(run.runDir, name);
21
+ await writeFile(path, content, 'utf8');
22
+ const record = { path, sha256: sha256(content), bytes: Buffer.byteLength(content) };
23
+ run.metadata.artifacts[name] = record;
24
+ await persistMetadata(run);
25
+ return record;
26
+ }
27
+ export async function readRunMetadata(runDir) {
28
+ return JSON.parse(await readFile(join(runDir, 'metadata.json'), 'utf8'));
29
+ }
30
+ function assertSafeArtifactName(name) {
31
+ if (name.length === 0 ||
32
+ isAbsolute(name) ||
33
+ name.includes('/') ||
34
+ name.includes('\\') ||
35
+ name.includes('..') ||
36
+ !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(name)) {
37
+ throw new Error(`Invalid artifact name: ${name}`);
38
+ }
39
+ }
40
+ async function persistMetadata(run) {
41
+ await writeFile(join(run.runDir, 'metadata.json'), JSON.stringify(run.metadata, null, 2), 'utf8');
42
+ }
43
+ //# sourceMappingURL=runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/artifacts/runs.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ import { defaultUsageFile, renderGainReport, resetUsage, summarizeUsage } from './usage/stats.js';
3
+ function argValue(args, name) {
4
+ const index = args.indexOf(name);
5
+ return index >= 0 ? args[index + 1] : undefined;
6
+ }
7
+ async function main() {
8
+ const args = process.argv.slice(2);
9
+ const command = args[0] ?? 'help';
10
+ if (command === 'gain') {
11
+ const file = argValue(args, '--file') ?? defaultUsageFile();
12
+ if (args.includes('--reset')) {
13
+ await resetUsage(file);
14
+ console.log(`Reset MiniMax usage stats: ${file}`);
15
+ return;
16
+ }
17
+ const today = args.includes('--today');
18
+ const since = argValue(args, '--since');
19
+ const now = process.env.MINIMAX_GAIN_NOW ? new Date(process.env.MINIMAX_GAIN_NOW) : undefined;
20
+ const summary = await summarizeUsage(file, { today, since, now });
21
+ const scope = today ? 'Today' : since ? `Since ${since}` : 'Global Scope';
22
+ console.log(renderGainReport(summary, scope));
23
+ return;
24
+ }
25
+ console.log('Usage: minimax gain [--today] [--since YYYY-MM-DD] [--reset] [--file <usage.jsonl>]');
26
+ }
27
+ main().catch((error) => {
28
+ console.error(error);
29
+ process.exit(1);
30
+ });
31
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElG,SAAS,QAAQ,CAAC,IAAc,EAAE,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;AACrG,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MiniMaxCallInput, MiniMaxCallResult } from './minimax.js';
2
+ export declare function callAnthropicMiniMax(input: MiniMaxCallInput): Promise<MiniMaxCallResult>;
3
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/client/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAcxE,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+B9F"}
@@ -0,0 +1,31 @@
1
+ import { joinMiniMaxUrl, shouldEnableThinking } from './minimax.js';
2
+ export async function callAnthropicMiniMax(input) {
3
+ const fetchImpl = input.fetchImpl ?? fetch;
4
+ const response = await fetchImpl(joinMiniMaxUrl(input.config.baseUrl, '/v1/messages'), {
5
+ method: 'POST',
6
+ headers: {
7
+ 'content-type': 'application/json',
8
+ authorization: `Bearer ${input.config.apiKey}`,
9
+ },
10
+ body: JSON.stringify({
11
+ model: input.config.model,
12
+ max_tokens: input.maxOutputTokens ?? input.config.maxOutputTokens,
13
+ system: input.system,
14
+ ...(shouldEnableThinking(input) ? { thinking: { type: 'enabled' } } : {}),
15
+ ...(input.config.serviceTier ? { service_tier: input.config.serviceTier } : {}),
16
+ messages: [{ role: 'user', content: input.prompt }],
17
+ }),
18
+ signal: AbortSignal.timeout(input.config.timeoutMs),
19
+ });
20
+ if (!response.ok) {
21
+ throw new Error(`MiniMax Anthropic API failed: ${response.status} ${await response.text()}`);
22
+ }
23
+ const raw = (await response.json());
24
+ const text = (raw.content ?? [])
25
+ .filter((block) => block.type === 'text')
26
+ .map((block) => block.text ?? '')
27
+ .join('\n')
28
+ .trim();
29
+ return { text, raw, usage: raw.usage };
30
+ }
31
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/client/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAapE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAuB;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;QACrF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;SAC/C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;YACzB,UAAU,EAAE,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,eAAe;YACjE,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;SACpD,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;KACpD,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;SAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SAChC,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IAEV,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { MiniMaxPluginConfig } from '../config.js';
2
+ export interface MiniMaxCallInput {
3
+ config: MiniMaxPluginConfig;
4
+ system: string;
5
+ prompt: string;
6
+ fetchImpl?: typeof fetch;
7
+ maxOutputTokens?: number;
8
+ thinking?: 'enabled' | 'disabled';
9
+ disableThinking?: boolean;
10
+ }
11
+ export interface MiniMaxCallResult {
12
+ text: string;
13
+ raw: unknown;
14
+ usage?: unknown;
15
+ }
16
+ export declare function joinMiniMaxUrl(baseUrl: string, path: string): string;
17
+ export declare function shouldEnableThinking(input: Pick<MiniMaxCallInput, 'thinking' | 'disableThinking'>): boolean;
18
+ export declare function callMiniMax(input: MiniMaxCallInput): Promise<MiniMaxCallResult>;
19
+ //# sourceMappingURL=minimax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.d.ts","sourceRoot":"","sources":["../../src/client/minimax.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAIxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAG3G;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAGrF"}
@@ -0,0 +1,16 @@
1
+ import { callAnthropicMiniMax } from './anthropic.js';
2
+ import { callOpenAiMiniMax } from './openai.js';
3
+ export function joinMiniMaxUrl(baseUrl, path) {
4
+ return `${baseUrl.replace(/\/+$/, '')}/${path.replace(/^\/+/, '')}`;
5
+ }
6
+ export function shouldEnableThinking(input) {
7
+ if (input.thinking)
8
+ return input.thinking === 'enabled';
9
+ return !input.disableThinking;
10
+ }
11
+ export async function callMiniMax(input) {
12
+ if (input.config.apiMode === 'anthropic')
13
+ return callAnthropicMiniMax(input);
14
+ return callOpenAiMiniMax(input);
15
+ }
16
+ //# sourceMappingURL=minimax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.js","sourceRoot":"","sources":["../../src/client/minimax.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkBhD,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA6D;IAChG,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;IACxD,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MiniMaxCallInput, MiniMaxCallResult } from './minimax.js';
2
+ export declare function callOpenAiMiniMax(input: MiniMaxCallInput): Promise<MiniMaxCallResult>;
3
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/client/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAQxE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2B3F"}
@@ -0,0 +1,28 @@
1
+ import { joinMiniMaxUrl, shouldEnableThinking } from './minimax.js';
2
+ export async function callOpenAiMiniMax(input) {
3
+ const fetchImpl = input.fetchImpl ?? fetch;
4
+ const response = await fetchImpl(joinMiniMaxUrl(input.config.baseUrl, '/chat/completions'), {
5
+ method: 'POST',
6
+ headers: {
7
+ 'content-type': 'application/json',
8
+ authorization: `Bearer ${input.config.apiKey}`,
9
+ },
10
+ body: JSON.stringify({
11
+ model: input.config.model,
12
+ messages: [
13
+ { role: 'system', content: input.system },
14
+ { role: 'user', content: input.prompt },
15
+ ],
16
+ max_tokens: input.maxOutputTokens ?? input.config.maxOutputTokens,
17
+ ...(shouldEnableThinking(input) ? { extra_body: { reasoning_split: true } } : {}),
18
+ ...(input.config.serviceTier ? { service_tier: input.config.serviceTier } : {}),
19
+ }),
20
+ signal: AbortSignal.timeout(input.config.timeoutMs),
21
+ });
22
+ if (!response.ok) {
23
+ throw new Error(`MiniMax OpenAI API failed: ${response.status} ${await response.text()}`);
24
+ }
25
+ const raw = (await response.json());
26
+ return { text: raw.choices?.[0]?.message?.content?.trim() ?? '', raw, usage: raw.usage };
27
+ }
28
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/client/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAOpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAuB;IAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,EAAE;QAC1F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;SAC/C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;YACzB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;aACxC;YACD,UAAU,EAAE,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,eAAe;YACjE,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;KACpD,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0B,CAAC;IAC7D,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type MiniMaxApiMode = 'anthropic' | 'openai';
2
+ export type MiniMaxServiceTier = 'standard' | 'priority';
3
+ export interface MiniMaxPluginConfig {
4
+ apiKey: string;
5
+ apiMode: MiniMaxApiMode;
6
+ model: string;
7
+ baseUrl: string;
8
+ timeoutMs: number;
9
+ maxOutputTokens: number;
10
+ artifactDir: string;
11
+ serviceTier?: MiniMaxServiceTier;
12
+ }
13
+ export declare function loadConfigFromEnv(env?: Record<string, string | undefined>): MiniMaxPluginConfig;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,mBAAmB,CAyB5G"}