@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,201 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export function defaultUsageFile(env = process.env) {
4
+ return env.MINIMAX_USAGE_FILE || `${env.HOME || '.'}/.minimax/usage.jsonl`;
5
+ }
6
+ export async function recordUsage(filePath, record) {
7
+ await mkdir(dirname(filePath), { recursive: true });
8
+ const line = JSON.stringify({ ...record, createdAt: record.createdAt ?? new Date().toISOString() }) + '\n';
9
+ await writeFile(filePath, line, { encoding: 'utf8', flag: 'a' });
10
+ }
11
+ function parseSinceDate(value) {
12
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value))
13
+ return new Date(`${value}T00:00:00.000Z`);
14
+ const parsed = new Date(value);
15
+ if (Number.isNaN(parsed.getTime()))
16
+ throw new Error(`Invalid --since date: ${value}`);
17
+ return parsed;
18
+ }
19
+ function dayRangeUtc(now) {
20
+ const start = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0, 0));
21
+ const end = new Date(start.getTime() + 24 * 60 * 60 * 1000);
22
+ return { start, end };
23
+ }
24
+ function filterRecords(records, options) {
25
+ if (options.today) {
26
+ const { start, end } = dayRangeUtc(options.now ?? new Date());
27
+ return records.filter((record) => {
28
+ const createdAt = record.createdAt ? new Date(record.createdAt) : undefined;
29
+ return createdAt && !Number.isNaN(createdAt.getTime()) && createdAt >= start && createdAt < end;
30
+ });
31
+ }
32
+ if (options.since) {
33
+ const since = parseSinceDate(options.since);
34
+ return records.filter((record) => {
35
+ const createdAt = record.createdAt ? new Date(record.createdAt) : undefined;
36
+ return createdAt && !Number.isNaN(createdAt.getTime()) && createdAt >= since;
37
+ });
38
+ }
39
+ return records;
40
+ }
41
+ export async function resetUsage(filePath) {
42
+ await mkdir(dirname(filePath), { recursive: true });
43
+ await writeFile(filePath, '', 'utf8');
44
+ }
45
+ export async function summarizeUsage(filePath, options = {}) {
46
+ let text = '';
47
+ try {
48
+ text = await readFile(filePath, 'utf8');
49
+ }
50
+ catch { /* empty */ }
51
+ const allRecords = text.split('\n').filter(Boolean).flatMap((line) => {
52
+ try {
53
+ return [JSON.parse(line)];
54
+ }
55
+ catch {
56
+ return [];
57
+ }
58
+ });
59
+ const records = filterRecords(allRecords, options);
60
+ const byToolMap = new Map();
61
+ let inputTokens = 0;
62
+ let outputTokens = 0;
63
+ let hostTokensReturned = 0;
64
+ let durationMs = 0;
65
+ for (const record of records) {
66
+ inputTokens += record.inputTokens || 0;
67
+ outputTokens += record.outputTokens || 0;
68
+ hostTokensReturned += record.hostTokensReturned || 0;
69
+ durationMs += record.durationMs || 0;
70
+ const raw = (record.inputTokens || 0) + (record.outputTokens || 0);
71
+ const saved = Math.max(0, raw - (record.hostTokensReturned || 0));
72
+ const entry = byToolMap.get(record.tool) ?? { tool: record.tool, count: 0, saved: 0, raw: 0, durationMs: 0 };
73
+ entry.count += 1;
74
+ entry.saved += saved;
75
+ entry.raw += raw;
76
+ entry.durationMs += record.durationMs || 0;
77
+ byToolMap.set(record.tool, entry);
78
+ }
79
+ const rawTotal = inputTokens + outputTokens;
80
+ const tokensSaved = Math.max(0, rawTotal - hostTokensReturned);
81
+ const byTool = [...byToolMap.values()]
82
+ .map((entry) => ({ tool: entry.tool, count: entry.count, saved: entry.saved, avgPercent: entry.raw ? (entry.saved / entry.raw) * 100 : 0, durationMs: entry.durationMs }))
83
+ .sort((a, b) => b.saved - a.saved);
84
+ return { totalCalls: records.length, inputTokens, outputTokens, hostTokensReturned, tokensSaved, durationMs, byTool };
85
+ }
86
+ function fmtTokens(value) {
87
+ if (value >= 1_000_000)
88
+ return `${(value / 1_000_000).toFixed(1)}M`;
89
+ if (value >= 1_000)
90
+ return `${(value / 1_000).toFixed(1)}K`;
91
+ return `${Math.round(value)}`;
92
+ }
93
+ function fmtMs(ms) {
94
+ if (ms >= 60_000)
95
+ return `${Math.floor(ms / 60_000)}m${Math.round((ms % 60_000) / 1000)}s`;
96
+ if (ms >= 1000)
97
+ return `${(ms / 1000).toFixed(1)}s`;
98
+ return `${Math.round(ms)}ms`;
99
+ }
100
+ // --- ANSI helpers ---
101
+ const RESET = '\x1b[0m';
102
+ const BOLD = '\x1b[1m';
103
+ const DIM = '\x1b[2m';
104
+ const CYAN = '\x1b[36m';
105
+ const GREEN = '\x1b[32m';
106
+ const YELLOW = '\x1b[33m';
107
+ const RED = '\x1b[31m';
108
+ function useColor() {
109
+ return process.stdout.isTTY === true && !process.env.NO_COLOR;
110
+ }
111
+ function makeStyles(color) {
112
+ if (!color) {
113
+ const noop = (s) => s;
114
+ return {
115
+ title: noop, dim: noop, bold: noop,
116
+ savingColor: () => noop,
117
+ bar: (pct, width = 25) => {
118
+ const filled = Math.round((Math.max(0, Math.min(pct, 100)) / 100) * width);
119
+ return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;
120
+ },
121
+ label: noop,
122
+ };
123
+ }
124
+ const savingColor = (pct) => {
125
+ const code = pct >= 60 ? GREEN : pct >= 30 ? YELLOW : RED;
126
+ return (s) => `${code}${s}${RESET}`;
127
+ };
128
+ return {
129
+ title: (s) => `${BOLD}${CYAN}${s}${RESET}`,
130
+ dim: (s) => `${DIM}${s}${RESET}`,
131
+ bold: (s) => `${BOLD}${s}${RESET}`,
132
+ savingColor,
133
+ bar: (pct, width = 25) => {
134
+ const clamped = Math.max(0, Math.min(pct, 100));
135
+ const filled = Math.round((clamped / 100) * width);
136
+ const code = clamped >= 60 ? GREEN : clamped >= 30 ? YELLOW : RED;
137
+ return `${code}${'█'.repeat(filled)}${RESET}${DIM}${'░'.repeat(width - filled)}${RESET}`;
138
+ },
139
+ label: (s) => s,
140
+ };
141
+ }
142
+ export function renderGainReport(summary, scope = 'Global Scope', color = useColor()) {
143
+ const s = makeStyles(color);
144
+ const rawTotal = summary.inputTokens + summary.outputTokens;
145
+ const percent = rawTotal ? (summary.tokensSaved / rawTotal) * 100 : 0;
146
+ const colorPct = s.savingColor(percent);
147
+ if (summary.totalCalls === 0) {
148
+ return [
149
+ `${s.title('MiniMax MCP Token Savings')} ${s.dim(`(${scope})`)}`,
150
+ s.dim('════════════════════════════════════════════════════════════'),
151
+ '',
152
+ s.dim('No usage recorded yet. Run some MiniMax MCP tools to start tracking.'),
153
+ ].join('\n');
154
+ }
155
+ const SEP1 = s.dim('════════════════════════════════════════════════════════════');
156
+ const SEP2 = s.dim('────────────────────────────────────────────────────────────────────────');
157
+ const delegation = summary.byTool.filter((t) => !t.tool.startsWith('mmx_'));
158
+ const cli = summary.byTool.filter((t) => t.tool.startsWith('mmx_'));
159
+ const lines = [
160
+ `${s.title('MiniMax MCP Token Savings')} ${s.dim(`(${scope})`)}`,
161
+ SEP1,
162
+ '',
163
+ `Total calls: ${s.bold(String(summary.totalCalls))}`,
164
+ `Input tokens: ${fmtTokens(summary.inputTokens)}`,
165
+ `Output tokens: ${fmtTokens(summary.outputTokens)}`,
166
+ `Host returned: ${fmtTokens(summary.hostTokensReturned)}`,
167
+ `Tokens saved: ${s.bold(colorPct(fmtTokens(summary.tokensSaved)))} ${colorPct(`(${percent.toFixed(1)}%)`)}`,
168
+ `Total exec time: ${fmtMs(summary.durationMs)}${summary.totalCalls ? ` ${s.dim(`(avg ${fmtMs(summary.durationMs / summary.totalCalls)})`)}` : ''}`,
169
+ `Efficiency: ${s.bar(percent)} ${s.bold(colorPct(`${percent.toFixed(1)}%`))}`,
170
+ ];
171
+ if (delegation.length > 0) {
172
+ lines.push('', s.bold('Delegation ') + s.dim('(token savings)'));
173
+ lines.push(SEP2);
174
+ lines.push(s.dim(' # Tool Count Saved Avg% Time Impact'));
175
+ lines.push(SEP2);
176
+ delegation.slice(0, 10).forEach((entry, index) => {
177
+ const c = s.savingColor(entry.avgPercent);
178
+ lines.push(`${s.dim(String(index + 1).padStart(3) + '.')} ${s.bold(entry.tool.padEnd(28).slice(0, 28))} ` +
179
+ `${String(entry.count).padStart(5)} ` +
180
+ `${c(fmtTokens(entry.saved).padStart(7))} ` +
181
+ `${c(entry.avgPercent.toFixed(1).padStart(5) + '%')} ` +
182
+ `${fmtMs(entry.durationMs).padStart(6)} ` +
183
+ `${s.bar(entry.avgPercent, 10)}`);
184
+ });
185
+ lines.push(SEP2);
186
+ }
187
+ if (cli.length > 0) {
188
+ lines.push('', s.bold('mmx CLI ') + s.dim('(media & API calls)'));
189
+ lines.push(SEP2);
190
+ lines.push(s.dim(' # Tool Count Time'));
191
+ lines.push(SEP2);
192
+ cli.slice(0, 10).forEach((entry, index) => {
193
+ lines.push(`${s.dim(String(index + 1).padStart(3) + '.')} ${s.bold(entry.tool.padEnd(28).slice(0, 28))} ` +
194
+ `${String(entry.count).padStart(5)} ` +
195
+ `${fmtMs(entry.durationMs).padStart(8)}`);
196
+ });
197
+ lines.push(SEP2);
198
+ }
199
+ return lines.join('\n');
200
+ }
201
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/usage/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MiniMaxPluginConfig } from '../config.js';
2
+ import type { MiniMaxCallResult } from '../client/minimax.js';
3
+ export declare function recordToolUsage(input: {
4
+ tool: string;
5
+ config: MiniMaxPluginConfig;
6
+ result: MiniMaxCallResult;
7
+ hostText: string;
8
+ startedAt: number;
9
+ usageFile?: string;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=tool-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-usage.d.ts","sourceRoot":"","sources":["../../src/usage/tool-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAa9D,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7L"}
@@ -0,0 +1,24 @@
1
+ import { defaultUsageFile, recordUsage } from './stats.js';
2
+ function usageNumber(usage, keys) {
3
+ if (!usage || typeof usage !== 'object')
4
+ return 0;
5
+ const source = usage;
6
+ for (const key of keys) {
7
+ const value = source[key];
8
+ if (typeof value === 'number' && Number.isFinite(value))
9
+ return value;
10
+ }
11
+ return 0;
12
+ }
13
+ export async function recordToolUsage(input) {
14
+ const inputTokens = usageNumber(input.result.usage, ['input_tokens', 'prompt_tokens']);
15
+ const outputTokens = usageNumber(input.result.usage, ['output_tokens', 'completion_tokens']);
16
+ await recordUsage(input.usageFile ?? defaultUsageFile(), {
17
+ tool: input.tool,
18
+ inputTokens,
19
+ outputTokens,
20
+ hostTokensReturned: Math.ceil(input.hostText.length / 4),
21
+ durationMs: Date.now() - input.startedAt,
22
+ }).catch(() => undefined);
23
+ }
24
+ //# sourceMappingURL=tool-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-usage.js","sourceRoot":"","sources":["../../src/usage/tool-usage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,SAAS,WAAW,CAAC,KAAc,EAAE,IAAc;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAwI;IAC5K,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC7F,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,IAAI,gBAAgB,EAAE,EAAE;QACvD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW;QACX,YAAY;QACZ,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACxD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;KACzC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const DEFAULT_LIMITS: {
2
+ readonly maxFiles: 80;
3
+ readonly maxBytesPerFile: 200000;
4
+ readonly maxTotalBytes: 8000000;
5
+ readonly maxOutputTokens: 16384;
6
+ readonly timeoutMs: 300000;
7
+ };
8
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/validation/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_LIMITS = {
2
+ maxFiles: 80,
3
+ maxBytesPerFile: 200_000,
4
+ maxTotalBytes: 8_000_000,
5
+ maxOutputTokens: 16_384,
6
+ timeoutMs: 300_000,
7
+ };
8
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/validation/limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE,OAAO;IACxB,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,MAAM;IACvB,SAAS,EAAE,OAAO;CACV,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface PatchValidationResult {
2
+ ok: boolean;
3
+ filesTouched: string[];
4
+ blockedOperations: string[];
5
+ }
6
+ export declare function validateUnifiedDiff(diff: string): PatchValidationResult;
7
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/validation/patch.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAcvE"}
@@ -0,0 +1,20 @@
1
+ export function validateUnifiedDiff(diff) {
2
+ const files = new Set();
3
+ const blockedOperations = [];
4
+ for (const line of diff.split('\n')) {
5
+ const match = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
6
+ if (!match)
7
+ continue;
8
+ for (const candidate of [match[1], match[2]]) {
9
+ if (candidate.startsWith('../') || candidate.includes('/../'))
10
+ blockedOperations.push(`parent traversal: ${candidate}`);
11
+ if (candidate === '.git' || candidate.startsWith('.git/'))
12
+ blockedOperations.push(`git path: ${candidate}`);
13
+ if (candidate === '/dev/null')
14
+ blockedOperations.push('delete operation');
15
+ files.add(candidate);
16
+ }
17
+ }
18
+ return { ok: blockedOperations.length === 0, filesTouched: [...files].sort(), blockedOperations };
19
+ }
20
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/validation/patch.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;YACxH,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,iBAAiB,CAAC,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;YAC5G,IAAI,SAAS,KAAK,WAAW;gBAAE,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC1E,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC;AACpG,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface CollectedFile {
2
+ absolutePath: string;
3
+ relativePath: string;
4
+ content: string;
5
+ bytes: number;
6
+ redacted: boolean;
7
+ }
8
+ export interface CollectFilesInput {
9
+ workspaceRoot: string;
10
+ paths: string[];
11
+ maxFiles?: number;
12
+ maxBytesPerFile?: number;
13
+ maxTotalBytes?: number;
14
+ }
15
+ export declare function collectFiles(input: CollectFilesInput): Promise<{
16
+ files: CollectedFile[];
17
+ warnings: string[];
18
+ }>;
19
+ //# sourceMappingURL=collect-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-files.d.ts","sourceRoot":"","sources":["../../src/workspace/collect-files.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqDpH"}
@@ -0,0 +1,60 @@
1
+ import { lstat, readdir, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { DEFAULT_LIMITS } from '../validation/limits.js';
4
+ import { isIgnoredPath } from './ignore.js';
5
+ import { assertSafeWorkspacePath, toRelativeWorkspacePath } from './paths.js';
6
+ import { detectSecretRisk, isSecretLikeFile, redactSecrets } from './secrets.js';
7
+ export async function collectFiles(input) {
8
+ const maxFiles = input.maxFiles ?? DEFAULT_LIMITS.maxFiles;
9
+ const maxBytesPerFile = input.maxBytesPerFile ?? DEFAULT_LIMITS.maxBytesPerFile;
10
+ const maxTotalBytes = input.maxTotalBytes ?? DEFAULT_LIMITS.maxTotalBytes;
11
+ const warnings = [];
12
+ const files = [];
13
+ let totalBytes = 0;
14
+ for (const path of input.paths) {
15
+ const absolute = assertSafeWorkspacePath(input.workspaceRoot, path);
16
+ await visit(absolute);
17
+ }
18
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
19
+ return { files, warnings };
20
+ async function visit(absolutePath) {
21
+ if (files.length >= maxFiles) {
22
+ warnings.push(`Skipped files after maxFiles=${maxFiles}`);
23
+ return;
24
+ }
25
+ const relativePath = toRelativeWorkspacePath(input.workspaceRoot, absolutePath);
26
+ if (relativePath && isIgnoredPath(relativePath))
27
+ return;
28
+ const info = await lstat(absolutePath);
29
+ if (info.isSymbolicLink()) {
30
+ warnings.push(`Skipped ${relativePath}: symlink not followed`);
31
+ return;
32
+ }
33
+ if (info.isDirectory()) {
34
+ const entries = await readdir(absolutePath);
35
+ for (const entry of entries)
36
+ await visit(join(absolutePath, entry));
37
+ return;
38
+ }
39
+ if (!info.isFile())
40
+ return;
41
+ if (info.size > maxBytesPerFile) {
42
+ warnings.push(`Skipped ${relativePath}: exceeds maxBytesPerFile=${maxBytesPerFile}`);
43
+ return;
44
+ }
45
+ if (totalBytes + info.size > maxTotalBytes) {
46
+ warnings.push(`Skipped ${relativePath}: exceeds maxTotalBytes=${maxTotalBytes}`);
47
+ return;
48
+ }
49
+ const raw = await readFile(absolutePath, 'utf8');
50
+ const risky = detectSecretRisk(relativePath, raw);
51
+ if (risky && isSecretLikeFile(relativePath)) {
52
+ warnings.push(`Skipped ${relativePath}: secret-like file`);
53
+ return;
54
+ }
55
+ const content = risky ? redactSecrets(raw) : raw;
56
+ files.push({ absolutePath, relativePath, content, bytes: Buffer.byteLength(content), redacted: risky });
57
+ totalBytes += info.size;
58
+ }
59
+ }
60
+ //# sourceMappingURL=collect-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-files.js","sourceRoot":"","sources":["../../src/workspace/collect-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAkBjF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC;IAC3D,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC;IAChF,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa,CAAC;IAC1E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACnE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAE3B,KAAK,UAAU,KAAK,CAAC,YAAoB;QACvC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAChF,IAAI,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC;YAAE,OAAO;QAExD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,WAAW,YAAY,wBAAwB,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,OAAO;gBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,IAAI,GAAG,eAAe,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,WAAW,YAAY,6BAA6B,eAAe,EAAE,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QACD,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,WAAW,YAAY,2BAA2B,aAAa,EAAE,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,KAAK,IAAI,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,WAAW,YAAY,oBAAoB,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_IGNORES: readonly [".git", "node_modules", "dist", "coverage", ".minimax/runs", ".DS_Store"];
2
+ export declare function isIgnoredPath(relativePath: string): boolean;
3
+ //# sourceMappingURL=ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/workspace/ignore.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,qFAOlB,CAAC;AAEX,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG3D"}
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_IGNORES = [
2
+ '.git',
3
+ 'node_modules',
4
+ 'dist',
5
+ 'coverage',
6
+ '.minimax/runs',
7
+ '.DS_Store',
8
+ ];
9
+ export function isIgnoredPath(relativePath) {
10
+ const normalized = relativePath.replaceAll('\\', '/').replace(/^\.\//, '');
11
+ return DEFAULT_IGNORES.some((entry) => normalized === entry || normalized.startsWith(`${entry}/`));
12
+ }
13
+ //# sourceMappingURL=ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/workspace/ignore.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,cAAc;IACd,MAAM;IACN,UAAU;IACV,eAAe;IACf,WAAW;CACH,CAAC;AAEX,MAAM,UAAU,aAAa,CAAC,YAAoB;IAChD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3E,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,KAAK,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;AACrG,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function assertSafeWorkspacePath(workspaceRoot: string, inputPath: string): string;
2
+ export declare function toRelativeWorkspacePath(workspaceRoot: string, absolutePath: string): string;
3
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/workspace/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAYxF;AAED,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3F"}
@@ -0,0 +1,18 @@
1
+ import { isAbsolute, relative, resolve, win32 } from 'node:path';
2
+ export function assertSafeWorkspacePath(workspaceRoot, inputPath) {
3
+ const root = resolve(workspaceRoot);
4
+ if (process.platform !== 'win32' && win32.isAbsolute(inputPath)) {
5
+ throw new Error(`Path escapes workspace: ${inputPath}`);
6
+ }
7
+ const resolved = resolve(root, inputPath);
8
+ const rel = relative(root, resolved);
9
+ const normalizedRel = rel.replaceAll('\\', '/');
10
+ if (rel === '' || (normalizedRel !== '..' && !normalizedRel.startsWith('../') && !isAbsolute(rel) && !win32.isAbsolute(rel))) {
11
+ return resolved;
12
+ }
13
+ throw new Error(`Path escapes workspace: ${inputPath}`);
14
+ }
15
+ export function toRelativeWorkspacePath(workspaceRoot, absolutePath) {
16
+ return relative(resolve(workspaceRoot), resolve(absolutePath)).replaceAll('\\', '/');
17
+ }
18
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/workspace/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAE,SAAiB;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7H,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAE,YAAoB;IACjF,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function isSecretLikeFile(relativePath: string): boolean;
2
+ export declare function detectSecretRisk(relativePath: string, content: string): boolean;
3
+ export declare function redactSecrets(content: string): string;
4
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/workspace/secrets.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAM/E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASrD"}
@@ -0,0 +1,32 @@
1
+ const SECRET_FILE_PATTERNS = [/^\.env(\.|$)/, /private[-_]?key/i, /credentials/i];
2
+ const SECRET_TEXT_PATTERNS = [
3
+ /(["']?api[_-]?key["']?\s*[:=]\s*["']?)([^\s"',}]+)/gi,
4
+ /(["']?token["']?\s*[:=]\s*["']?)([^\s"',}]+)/gi,
5
+ /(["']?password["']?\s*[:=]\s*["']?)([^\s"',}]+)/gi,
6
+ /(["']?secret["']?\s*[:=]\s*["']?)([^\s"',}]+)/gi,
7
+ /(-----BEGIN [A-Z ]*PRIVATE KEY-----)[\s\S]*?(-----END [A-Z ]*PRIVATE KEY-----)/g,
8
+ ];
9
+ export function isSecretLikeFile(relativePath) {
10
+ const normalized = relativePath.replaceAll('\\', '/').split('/').pop() ?? relativePath;
11
+ return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(normalized));
12
+ }
13
+ export function detectSecretRisk(relativePath, content) {
14
+ if (isSecretLikeFile(relativePath))
15
+ return true;
16
+ return SECRET_TEXT_PATTERNS.some((pattern) => {
17
+ pattern.lastIndex = 0;
18
+ return pattern.test(content);
19
+ });
20
+ }
21
+ export function redactSecrets(content) {
22
+ let redacted = content;
23
+ for (const pattern of SECRET_TEXT_PATTERNS) {
24
+ redacted = redacted.replace(pattern, (_match, prefix, suffix) => {
25
+ if (String(prefix).startsWith('-----BEGIN'))
26
+ return '[REDACTED_PRIVATE_KEY]';
27
+ return `${prefix}[REDACTED]`;
28
+ });
29
+ }
30
+ return redacted;
31
+ }
32
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/workspace/secrets.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAClF,MAAM,oBAAoB,GAAG;IAC3B,sDAAsD;IACtD,gDAAgD;IAChD,mDAAmD;IACnD,iDAAiD;IACjD,iFAAiF;CAClF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,YAAY,CAAC;IACvF,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,OAAe;IACpE,IAAI,gBAAgB,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3C,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QAC3C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;YAC9E,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,OAAO,wBAAwB,CAAC;YAC7E,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@hugo.bastidas/minimax-plugin",
3
+ "version": "0.1.0",
4
+ "description": "MCP delegation plugin for MiniMax M3 — Claude Code, Codex, and OpenCode compatible",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "minimax-plugin": "./dist/index.js",
9
+ "minimax": "./dist/cli.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "setup": "node scripts/install.mjs",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "typecheck": "tsc --noEmit",
19
+ "postbuild": "node -e \"const {chmodSync}=require('fs');chmodSync('dist/cli.js',0o755);\"",
20
+ "prepublishOnly": "npm run build && npm test"
21
+ },
22
+ "dependencies": {
23
+ "@clack/prompts": "^1.4.0",
24
+ "@modelcontextprotocol/sdk": "^1.12.0",
25
+ "zod": "^3.23.8"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.14.0",
29
+ "typescript": "^5.5.0",
30
+ "vitest": "^2.0.0"
31
+ },
32
+ "keywords": [
33
+ "mcp",
34
+ "minimax",
35
+ "claude-code",
36
+ "codex",
37
+ "opencode",
38
+ "agent",
39
+ "delegation"
40
+ ],
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://gitlab.com/tools5290918/minimax-plugin.git"
44
+ },
45
+ "homepage": "https://gitlab.com/tools5290918/minimax-plugin",
46
+ "bugs": "https://gitlab.com/tools5290918/minimax-plugin/-/issues",
47
+ "license": "MIT",
48
+ "engines": {
49
+ "node": ">=20.0.0"
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "scripts",
54
+ ".claude-plugin",
55
+ "skills",
56
+ "codex-plugin.toml",
57
+ ".mcp.json",
58
+ "README.md",
59
+ "AGENTS.md"
60
+ ],
61
+ "publishConfig": {
62
+ "access": "public"
63
+ }
64
+ }
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ // Claude Code config mutation helpers - delegates to TypeScript implementation
3
+ export { writeClaudeConfig, removeClaudeConfig } from '../dist/install/claude-config.js';
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ // Codex config mutation helpers - delegates to TypeScript implementation
3
+ export { writeCodexConfig, removeCodexConfig } from '../dist/install/codex-config.js';