@bonginkan/maria 4.4.2 → 4.4.3

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.
@@ -23,9 +23,9 @@ var crypto6 = require('crypto');
23
23
  var perf_hooks = require('perf_hooks');
24
24
  var dotenv = require('dotenv');
25
25
  var child_process = require('child_process');
26
+ var promises = require('timers/promises');
26
27
  var string_decoder = require('string_decoder');
27
28
  var fs9 = require('fs-extra');
28
- var promises = require('timers/promises');
29
29
  var dns = require('dns/promises');
30
30
  var yaml = require('js-yaml');
31
31
  var neo4j = require('neo4j-driver');
@@ -526,22 +526,22 @@ function dataUriToBuffer(uri) {
526
526
  if (firstComma === -1 || firstComma <= 4) {
527
527
  throw new TypeError("malformed data: URI");
528
528
  }
529
- const meta27 = uri.substring(5, firstComma).split(";");
529
+ const meta28 = uri.substring(5, firstComma).split(";");
530
530
  let charset = "";
531
531
  let base64 = false;
532
- const type = meta27[0] || "text/plain";
532
+ const type = meta28[0] || "text/plain";
533
533
  let typeFull = type;
534
- for (let i2 = 1; i2 < meta27.length; i2++) {
535
- if (meta27[i2] === "base64") {
534
+ for (let i2 = 1; i2 < meta28.length; i2++) {
535
+ if (meta28[i2] === "base64") {
536
536
  base64 = true;
537
- } else if (meta27[i2]) {
538
- typeFull += `;${meta27[i2]}`;
539
- if (meta27[i2].indexOf("charset=") === 0) {
540
- charset = meta27[i2].substring(8);
537
+ } else if (meta28[i2]) {
538
+ typeFull += `;${meta28[i2]}`;
539
+ if (meta28[i2].indexOf("charset=") === 0) {
540
+ charset = meta28[i2].substring(8);
541
541
  }
542
542
  }
543
543
  }
544
- if (!meta27[0] && !charset.length) {
544
+ if (!meta28[0] && !charset.length) {
545
545
  typeFull += ";charset=US-ASCII";
546
546
  charset = "US-ASCII";
547
547
  }
@@ -7110,8 +7110,8 @@ var init_base_provider = __esm({
7110
7110
  throw error2;
7111
7111
  }
7112
7112
  if (attempt < maxRetries - 1) {
7113
- const delay = Math.pow(2, attempt) * 1e3;
7114
- await new Promise((resolve19) => setTimeout(resolve19, delay));
7113
+ const delay2 = Math.pow(2, attempt) * 1e3;
7114
+ await new Promise((resolve19) => setTimeout(resolve19, delay2));
7115
7115
  }
7116
7116
  }
7117
7117
  }
@@ -7517,8 +7517,8 @@ var init_SecretManagerIntegration = __esm({
7517
7517
  return payload.toString();
7518
7518
  } catch (e2) {
7519
7519
  if (attempt === this.MAX_RETRIES - 1) break;
7520
- const delay = this.BASE_DELAY_MS * Math.pow(2, attempt);
7521
- await new Promise((r2) => setTimeout(r2, delay));
7520
+ const delay2 = this.BASE_DELAY_MS * Math.pow(2, attempt);
7521
+ await new Promise((r2) => setTimeout(r2, delay2));
7522
7522
  }
7523
7523
  }
7524
7524
  return void 0;
@@ -8794,10 +8794,10 @@ var init_llm_health_checker = __esm({
8794
8794
  }
8795
8795
  async startLMStudio() {
8796
8796
  try {
8797
- const { spawn: spawn4 } = await import('child_process');
8797
+ const { spawn: spawn5 } = await import('child_process');
8798
8798
  const _lmsPath = "/Users/bongin_max/.lmstudio/bin/lms";
8799
8799
  return new Promise((resolve19) => {
8800
- const _child = spawn4(_lmsPath, ["server", "start"], {
8800
+ const _child = spawn5(_lmsPath, ["server", "start"], {
8801
8801
  stdio: "ignore",
8802
8802
  detached: true
8803
8803
  });
@@ -26067,8 +26067,8 @@ var require_package = __commonJS({
26067
26067
  "package.json"(exports, module) {
26068
26068
  module.exports = {
26069
26069
  name: "@bonginkan/maria",
26070
- version: "4.4.2",
26071
- description: "\u{1F680} MARIA v4.4.2 - Enterprise AI Development Platform with identity system and character voice implementation. Features 74 production-ready commands with comprehensive fallback implementation, local LLM support, and zero external dependencies. Includes natural language coding, AI safety evaluation, intelligent evolution system, episodic memory with PII masking, and real-time monitoring dashboard. Built with TypeScript AST-powered code generation, OAuth2.0 + PKCE authentication, quantum-resistant cryptography, and enterprise-grade performance.",
26070
+ version: "4.4.3",
26071
+ description: "\u{1F680} MARIA v4.4.3 - Enterprise AI Development Platform with identity system and character voice implementation. Features 74 production-ready commands with comprehensive fallback implementation, local LLM support, and zero external dependencies. Includes natural language coding, AI safety evaluation, intelligent evolution system, episodic memory with PII masking, and real-time monitoring dashboard. Built with TypeScript AST-powered code generation, OAuth2.0 + PKCE authentication, quantum-resistant cryptography, and enterprise-grade performance.",
26072
26072
  keywords: [
26073
26073
  "ai",
26074
26074
  "cli",
@@ -27046,6 +27046,10 @@ ${authUrl}
27046
27046
  });
27047
27047
 
27048
27048
  // src/services/cli-auth/MariaAPIClient.ts
27049
+ var MariaAPIClient_exports = {};
27050
+ __export(MariaAPIClient_exports, {
27051
+ MariaAPIClient: () => MariaAPIClient
27052
+ });
27049
27053
  var MariaAPIClient;
27050
27054
  var init_MariaAPIClient = __esm({
27051
27055
  "src/services/cli-auth/MariaAPIClient.ts"() {
@@ -27069,12 +27073,36 @@ var init_MariaAPIClient = __esm({
27069
27073
  "Content-Type": "application/json"
27070
27074
  };
27071
27075
  if (requiresAuth2) {
27072
- const token = await this.authClient.getAccessToken();
27076
+ let token = await this.authClient.getAccessToken();
27077
+ if (!token) {
27078
+ try {
27079
+ const stored = await this.authClient.loadStoredTokens();
27080
+ if (stored?.refreshToken) {
27081
+ await this.authClient.refreshAccessToken(stored.refreshToken);
27082
+ token = await this.authClient.getAccessToken();
27083
+ }
27084
+ } catch (e2) {
27085
+ if (process.env.MARIA_DEBUG === "1") {
27086
+ console.error("[MARIA DEBUG] Token refresh preflight failed", String(e2?.message || e2));
27087
+ }
27088
+ }
27089
+ }
27073
27090
  if (!token) {
27074
27091
  throw new Error('Authentication required. Please run "maria /login" first.');
27075
27092
  }
27076
27093
  headers["Authorization"] = `Bearer ${token}`;
27077
27094
  }
27095
+ if (process.env.MARIA_DEBUG === "1") {
27096
+ try {
27097
+ console.error("[MARIA DEBUG] API request start", {
27098
+ method,
27099
+ url: url2,
27100
+ requiresAuth: requiresAuth2,
27101
+ hasAuthHeader: Boolean(headers["Authorization"])
27102
+ });
27103
+ } catch {
27104
+ }
27105
+ }
27078
27106
  let lastError = null;
27079
27107
  for (let attempt = 1; attempt <= (this.config.retryAttempts || 3); attempt++) {
27080
27108
  try {
@@ -27089,26 +27117,52 @@ var init_MariaAPIClient = __esm({
27089
27117
  clearTimeout(timeoutId);
27090
27118
  const responseData = await response.json();
27091
27119
  if (!response.ok) {
27092
- if (response.status === 401) {
27120
+ if (response.status === 401 && requiresAuth2) {
27093
27121
  const tokens2 = await this.authClient.loadStoredTokens();
27094
27122
  if (tokens2?.refreshToken) {
27095
27123
  try {
27124
+ if (process.env.MARIA_DEBUG === "1") {
27125
+ try {
27126
+ console.error("[MARIA DEBUG] 401 received, attempting token refresh");
27127
+ } catch {
27128
+ }
27129
+ }
27096
27130
  await this.authClient.refreshAccessToken(tokens2.refreshToken);
27131
+ const refreshedToken = await this.authClient.getAccessToken();
27132
+ if (refreshedToken) {
27133
+ headers["Authorization"] = `Bearer ${refreshedToken}`;
27134
+ }
27135
+ if (process.env.MARIA_DEBUG === "1") {
27136
+ try {
27137
+ console.error("[MARIA DEBUG] Token refresh completed", { hasAuthHeader: Boolean(headers["Authorization"]) });
27138
+ } catch {
27139
+ }
27140
+ }
27097
27141
  continue;
27098
27142
  } catch {
27099
- throw new Error("Session expired. Please login again.");
27100
27143
  }
27101
27144
  }
27102
- throw new Error(responseData.hint || "Authentication failed");
27145
+ throw new Error(responseData?.hint || "Authentication failed");
27103
27146
  }
27104
27147
  if (response.status === 429) {
27105
27148
  const retryAfter = response.headers.get("Retry-After");
27106
- const delay = retryAfter ? parseInt(retryAfter) * 1e3 : 5e3;
27107
- console.log(`\u23F3 Rate limited. Waiting ${delay}ms before retry...`);
27108
- await new Promise((resolve19) => setTimeout(resolve19, delay));
27149
+ const delay2 = retryAfter ? parseInt(retryAfter) * 1e3 : 5e3;
27150
+ console.log(`\u23F3 Rate limited. Waiting ${delay2}ms before retry...`);
27151
+ await new Promise((resolve19) => setTimeout(resolve19, delay2));
27109
27152
  continue;
27110
27153
  }
27111
- throw new Error(responseData.error || `Request failed: ${response.status}`);
27154
+ const details = {
27155
+ status: response.status,
27156
+ endpoint: url2,
27157
+ method,
27158
+ attempt,
27159
+ response: responseData
27160
+ };
27161
+ if (process.env.MARIA_DEBUG === "1") {
27162
+ console.error("[MARIA DEBUG] API request failed", details);
27163
+ }
27164
+ const msg = responseData && (responseData.error || responseData.message) || `Request failed: ${response.status}`;
27165
+ throw new Error(msg);
27112
27166
  }
27113
27167
  return responseData;
27114
27168
  } catch (error2) {
@@ -27117,11 +27171,17 @@ var init_MariaAPIClient = __esm({
27117
27171
  console.error(`Request timeout after ${this.config.timeout}ms`);
27118
27172
  }
27119
27173
  if (attempt < (this.config.retryAttempts || 3)) {
27174
+ if (process.env.MARIA_DEBUG === "1") {
27175
+ console.error("[MARIA DEBUG] API error on attempt", { method, endpoint: url2, attempt, error: String(error2?.message || error2) });
27176
+ }
27120
27177
  console.log(`\u{1F504} Retrying request (attempt ${attempt + 1}/${this.config.retryAttempts})...`);
27121
27178
  await new Promise((resolve19) => setTimeout(resolve19, 1e3 * attempt));
27122
27179
  }
27123
27180
  }
27124
27181
  }
27182
+ if (process.env.MARIA_DEBUG === "1") {
27183
+ console.error("[MARIA DEBUG] API request exhausted retries", { method, endpoint: url2, error: String(lastError?.message || lastError) });
27184
+ }
27125
27185
  throw lastError || new Error("Request failed after all retries");
27126
27186
  }
27127
27187
  /**
@@ -27166,6 +27226,33 @@ var init_MariaAPIClient = __esm({
27166
27226
  async getAPIInfo() {
27167
27227
  return this.request("GET", "/api/v1", null, false);
27168
27228
  }
27229
+ /**
27230
+ * Create Stripe checkout session for a target plan
27231
+ */
27232
+ async createCheckoutSession(planId, options) {
27233
+ try {
27234
+ return await this.request("POST", "/api/stripe/create-checkout-session", {
27235
+ planId,
27236
+ isAnnual: Boolean(options?.isAnnual)
27237
+ });
27238
+ } catch (e2) {
27239
+ return await this.request("POST", "/api/create-checkout-session", {
27240
+ planId,
27241
+ isAnnual: Boolean(options?.isAnnual)
27242
+ });
27243
+ }
27244
+ }
27245
+ /**
27246
+ * Create Stripe customer portal session
27247
+ */
27248
+ async createPortalSession(returnUrl) {
27249
+ const body = { returnUrl: returnUrl || (process.env.MARIA_RETURN_URL || "https://maria-code.ai/manage") };
27250
+ try {
27251
+ return await this.request("POST", "/api/stripe/create-portal-session", body);
27252
+ } catch (e2) {
27253
+ return await this.request("POST", "/api/create-portal-session", body);
27254
+ }
27255
+ }
27169
27256
  /**
27170
27257
  * Health check
27171
27258
  */
@@ -27237,7 +27324,7 @@ var init_MariaAPIClient = __esm({
27237
27324
  });
27238
27325
  console.log("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n");
27239
27326
  } catch (error2) {
27240
- console.error("Failed to fetch usage stats:", error2.message);
27327
+ console.error("Failed to fetch usage stats:", error2?.message || String(error2));
27241
27328
  }
27242
27329
  }
27243
27330
  /**
@@ -27954,6 +28041,12 @@ var init_AuthSecretManager = __esm({
27954
28041
  new AuthSecretManager();
27955
28042
  }
27956
28043
  });
28044
+
28045
+ // src/utils/open-url.ts
28046
+ var open_url_exports = {};
28047
+ __export(open_url_exports, {
28048
+ openUrl: () => openUrl
28049
+ });
27957
28050
  async function openUrl(url2) {
27958
28051
  if (process.env.CI === "true" || process.env.SSH_CONNECTION || process.env.CONTAINER === "true") {
27959
28052
  throw new Error("Headless environment");
@@ -28131,7 +28224,7 @@ var init_AuthenticationManager = __esm({
28131
28224
  const response = await fetch(`${this.apiBase}/api/user/profile`, {
28132
28225
  headers: {
28133
28226
  "Authorization": `Bearer ${tokens2.accessToken}`,
28134
- "User-Agent": `maria-cli/${process.env.CLI_VERSION || "4.4.2"}`
28227
+ "User-Agent": `maria-cli/${process.env.CLI_VERSION || "4.4.3"}`
28135
28228
  }
28136
28229
  });
28137
28230
  if (response.status === 401) {
@@ -28785,7 +28878,7 @@ async function callApi(path66, init3 = {}) {
28785
28878
  "Authorization": `Bearer ${token}`,
28786
28879
  "X-Device-Id": getDeviceId(),
28787
28880
  "X-Session-Id": getSessionId() || "",
28788
- "User-Agent": `maria-cli/${process.env.CLI_VERSION || "4.4.2"}`,
28881
+ "User-Agent": `maria-cli/${process.env.CLI_VERSION || "4.4.3"}`,
28789
28882
  "Content-Type": init3.headers?.["Content-Type"] || "application/json"
28790
28883
  });
28791
28884
  const doFetch = async (token) => {
@@ -29050,6 +29143,273 @@ var init_choice_memory = __esm({
29050
29143
  }
29051
29144
  });
29052
29145
 
29146
+ // src/services/local-llm-manager.ts
29147
+ var local_llm_manager_exports = {};
29148
+ __export(local_llm_manager_exports, {
29149
+ ensureLocalProviderUp: () => ensureLocalProviderUp,
29150
+ generateViaCli: () => generateViaCli,
29151
+ selectLocalProviderAndModel: () => selectLocalProviderAndModel
29152
+ });
29153
+ function debugLog(...args2) {
29154
+ if (process.env.MARIA_DEBUG === "1") {
29155
+ try {
29156
+ console.log("[DEBUG/local-llm]", ...args2);
29157
+ } catch {
29158
+ }
29159
+ }
29160
+ }
29161
+ async function isUp(provider) {
29162
+ const res = await discoverLocalProvider(provider, { timeoutMs: 600, nearbyScan: true });
29163
+ return res?.base || null;
29164
+ }
29165
+ async function tryStartLMStudio() {
29166
+ child_process.spawn("lms", ["server", "start"], { stdio: "ignore", detached: true }).unref();
29167
+ }
29168
+ async function tryStartOllama() {
29169
+ child_process.spawn("ollama", ["serve"], { stdio: "ignore", detached: true }).unref();
29170
+ }
29171
+ async function waitUntilUp(provider, timeoutMs = 15e3) {
29172
+ const start = Date.now();
29173
+ while (Date.now() - start < timeoutMs) {
29174
+ const base = await isUp(provider);
29175
+ if (base) return base;
29176
+ await promises.setTimeout(500);
29177
+ }
29178
+ return null;
29179
+ }
29180
+ async function ensureLocalProviderUp(preferredOrder = ["lmstudio", "ollama"]) {
29181
+ for (const p of preferredOrder) {
29182
+ const up = await isUp(p);
29183
+ if (up) {
29184
+ debugLog("provider up", p, up);
29185
+ return { provider: p, baseUrl: up, started: false };
29186
+ }
29187
+ try {
29188
+ debugLog("attempting autostart", p);
29189
+ if (p === "lmstudio") await tryStartLMStudio();
29190
+ else await tryStartOllama();
29191
+ const providerTimeout = p === "lmstudio" ? parseInt(process.env.LMSTUDIO_STARTUP_TIMEOUT_MS || "") || 9e4 : parseInt(process.env.OLLAMA_STARTUP_TIMEOUT_MS || "") || 2e4;
29192
+ const base = await waitUntilUp(p, providerTimeout);
29193
+ if (base) {
29194
+ debugLog("provider started", p, base);
29195
+ return { provider: p, baseUrl: base, started: true };
29196
+ }
29197
+ debugLog("autostart failed or timed out", p);
29198
+ } catch (e2) {
29199
+ debugLog("autostart error", p, e2?.message || String(e2));
29200
+ }
29201
+ }
29202
+ debugLog("no preferred providers available");
29203
+ return null;
29204
+ }
29205
+ function parseModelId(id) {
29206
+ const s2 = id.toLowerCase();
29207
+ const afterSlash = s2.includes("/") ? s2.split("/").pop() || s2 : s2;
29208
+ const m1 = afterSlash.match(/^(gpt-oss|gemma|llama|magistral)[-:]?(\d+(?:\.\d+)?)?([a-z]*)?[:\-]?(\d+)?([a-z]*)?$/);
29209
+ if (m1) {
29210
+ const fam = m1[1];
29211
+ const verToken = m1[2] || null;
29212
+ const lastNum = m1[4] || null;
29213
+ const sizeToken = (m1[3] || m1[5] || "").toLowerCase();
29214
+ const version = verToken ? Number(verToken) : null;
29215
+ const size = lastNum ? Number(lastNum) : sizeToken.includes("b") ? Number(sizeToken.replace(/[^0-9]/g, "")) : null;
29216
+ return { family: fam, version, size };
29217
+ }
29218
+ const m2 = afterSlash.match(/^(gpt-oss|gemma|llama|magistral)[^-:]*[:](\d+)([a-z])$/);
29219
+ if (m2) {
29220
+ return { family: m2[1], version: null, size: Number(m2[2]) };
29221
+ }
29222
+ return { family: s2.split(/[-:]/)[0], version: null, size: null };
29223
+ }
29224
+ function pickBestModel(models, prefs) {
29225
+ if (!models.length) return null;
29226
+ if (prefs.explicitModel) {
29227
+ const exact = models.find((m2) => m2.toLowerCase() === prefs.explicitModel.toLowerCase());
29228
+ if (exact) return exact;
29229
+ const family = prefs.explicitModel.split(/[:\-]/)[0].toLowerCase();
29230
+ const famMs = models.filter((m2) => m2.toLowerCase().startsWith(family));
29231
+ if (famMs.length) models = famMs;
29232
+ }
29233
+ const familyRank = (id) => {
29234
+ const fam = parseModelId(id).family;
29235
+ const idx = FAMILY_ORDER.indexOf(fam);
29236
+ return idx === -1 ? 999 : idx;
29237
+ };
29238
+ const score = (id) => {
29239
+ const { version, size } = parseModelId(id);
29240
+ return [-(version || 0), -(size || 0)];
29241
+ };
29242
+ const sorted = [...models].sort((a, b) => {
29243
+ const fa = familyRank(a);
29244
+ const fb = familyRank(b);
29245
+ if (fa !== fb) return fa - fb;
29246
+ const [va, sa] = score(a);
29247
+ const [vb, sb] = score(b);
29248
+ if (va !== vb) return va - vb;
29249
+ return sa - sb;
29250
+ });
29251
+ return sorted[0] || null;
29252
+ }
29253
+ async function listModels(provider, baseUrl) {
29254
+ const viaCli = await listModelsViaCli(provider).catch(() => []);
29255
+ if (viaCli.length) return viaCli;
29256
+ try {
29257
+ const url2 = provider === "ollama" ? `${baseUrl}/api/tags` : `${baseUrl}/models`;
29258
+ const res = await fetch(url2);
29259
+ if (!res.ok) return [];
29260
+ const body = await res.json().catch(() => ({}));
29261
+ if (provider === "ollama") {
29262
+ const arr2 = Array.isArray(body.models) ? body.models : body.data || [];
29263
+ return arr2.map((m2) => m2?.name).filter(Boolean);
29264
+ }
29265
+ const arr = Array.isArray(body.data) ? body.data : Array.isArray(body._data) ? body._data : [];
29266
+ return arr.map((m2) => m2?.id).filter(Boolean);
29267
+ } catch {
29268
+ return [];
29269
+ }
29270
+ }
29271
+ async function ensureBaselineModel(provider) {
29272
+ if (provider === "lmstudio") {
29273
+ child_process.spawn("lms", ["model", "download", "openai/gpt-oss-20b"], { stdio: "ignore", detached: true }).unref();
29274
+ return;
29275
+ }
29276
+ child_process.spawn("ollama", ["pull", "gpt-oss:latest"], { stdio: "ignore", detached: true }).unref();
29277
+ }
29278
+ async function selectLocalProviderAndModel(prefs = {}) {
29279
+ const order = prefs.explicitProvider ? [
29280
+ prefs.explicitProvider,
29281
+ ...prefs.explicitProvider === "lmstudio" ? ["ollama"] : ["lmstudio"]
29282
+ ] : ["lmstudio", "ollama"];
29283
+ const up = await ensureLocalProviderUp(order);
29284
+ if (!up) return null;
29285
+ let models = await listModels(up.provider, up.baseUrl);
29286
+ if (process.env.MARIA_DEBUG === "1") {
29287
+ try {
29288
+ console.log("[DEBUG/local-llm] models.list", up.provider, models.slice(0, 20));
29289
+ } catch {
29290
+ }
29291
+ }
29292
+ if (!models.length) {
29293
+ await ensureBaselineModel(up.provider);
29294
+ await promises.setTimeout(2e3);
29295
+ models = await listModels(up.provider, up.baseUrl);
29296
+ }
29297
+ if (up.provider === "lmstudio") {
29298
+ const hasPreferred = models.some((m2) => parseModelId(m2).family === "gpt-oss");
29299
+ if (!hasPreferred) {
29300
+ await ensureBaselineModel("lmstudio");
29301
+ await promises.setTimeout(3e3);
29302
+ models = await listModels(up.provider, up.baseUrl);
29303
+ if (process.env.MARIA_DEBUG === "1") {
29304
+ try {
29305
+ console.log("[DEBUG/local-llm] models.relist.after-download", models.slice(0, 20));
29306
+ } catch {
29307
+ }
29308
+ }
29309
+ }
29310
+ }
29311
+ const chosen = pickBestModel(models, prefs) || (up.provider === "lmstudio" ? "openai/gpt-oss-20b" : "gpt-oss:latest");
29312
+ debugLog("selected provider/model", up.provider, chosen);
29313
+ return { provider: up.provider, baseUrl: up.baseUrl, model: chosen };
29314
+ }
29315
+ function runCommand(cmd, args2, input3, timeoutMs = 3e5) {
29316
+ return new Promise((resolve19) => {
29317
+ const child = child_process.spawn(cmd, args2, { stdio: ["pipe", "pipe", "pipe"] });
29318
+ let stdout2 = "";
29319
+ let stderr = "";
29320
+ const timer = setTimeout(() => {
29321
+ try {
29322
+ child.kill("SIGKILL");
29323
+ } catch {
29324
+ }
29325
+ }, timeoutMs);
29326
+ child.stdout?.on("data", (d) => {
29327
+ stdout2 += d.toString();
29328
+ });
29329
+ child.stderr?.on("data", (d) => {
29330
+ stderr += d.toString();
29331
+ });
29332
+ child.on("exit", (code) => {
29333
+ clearTimeout(timer);
29334
+ resolve19({ code, stdout: stdout2, stderr });
29335
+ });
29336
+ if (input3 && child.stdin) {
29337
+ child.stdin.write(input3);
29338
+ child.stdin.end();
29339
+ }
29340
+ });
29341
+ }
29342
+ async function listModelsViaCli(provider) {
29343
+ try {
29344
+ if (provider === "lmstudio") {
29345
+ const res2 = await runCommand("lms", ["ls", "--json"]);
29346
+ if (res2.code === 0) {
29347
+ try {
29348
+ const j = JSON.parse(res2.stdout);
29349
+ const arr = Array.isArray(j?.models) ? j.models : Array.isArray(j?.data) ? j.data : [];
29350
+ return arr.map((m2) => m2?.id || m2?.name).filter(Boolean);
29351
+ } catch {
29352
+ }
29353
+ }
29354
+ const res22 = await runCommand("lms", ["ls"]);
29355
+ if (res22.code === 0) {
29356
+ return res22.stdout.split(/\r?\n/).map((s2) => s2.trim()).filter(Boolean);
29357
+ }
29358
+ return [];
29359
+ }
29360
+ const res = await runCommand("ollama", ["list"]);
29361
+ if (res.code === 0) {
29362
+ const lines = res.stdout.split(/\r?\n/).slice(1).filter(Boolean);
29363
+ const names = lines.map((l) => l.split(/\s+/)[0]).filter(Boolean);
29364
+ return names;
29365
+ }
29366
+ return [];
29367
+ } catch {
29368
+ return [];
29369
+ }
29370
+ }
29371
+ async function generateViaCli(provider, model, prompt) {
29372
+ try {
29373
+ if (provider === "lmstudio") {
29374
+ const args2 = ["chat", model, "-p", prompt, "--yes", "--offline", "--ttl", "2"];
29375
+ if (process.env.MARIA_DEBUG === "1") {
29376
+ try {
29377
+ console.log("[DEBUG/local][lmstudio-cli] args", args2);
29378
+ } catch {
29379
+ }
29380
+ }
29381
+ const exec2 = await runCommand("lms", args2);
29382
+ if (process.env.MARIA_DEBUG === "1") {
29383
+ try {
29384
+ console.log("[DEBUG/local][lmstudio-cli] exit", exec2.code, "stdout.len:", exec2.stdout.length, "stderr.len:", exec2.stderr.length);
29385
+ } catch {
29386
+ }
29387
+ }
29388
+ if (exec2.code === 0) {
29389
+ const out = exec2.stdout.trim();
29390
+ if (out) return out;
29391
+ const err = exec2.stderr.trim();
29392
+ if (err) return err;
29393
+ }
29394
+ return null;
29395
+ }
29396
+ const res = await runCommand("ollama", ["run", model], prompt);
29397
+ if (res.code === 0) return res.stdout.trim();
29398
+ const res2 = await runCommand("ollama", ["run", model, prompt]);
29399
+ if (res2.code === 0) return res2.stdout.trim();
29400
+ return null;
29401
+ } catch {
29402
+ return null;
29403
+ }
29404
+ }
29405
+ var FAMILY_ORDER;
29406
+ var init_local_llm_manager = __esm({
29407
+ "src/services/local-llm-manager.ts"() {
29408
+ init_llm_endpoint_discovery();
29409
+ FAMILY_ORDER = ["gpt-oss", "gemma", "llama", "magistral"];
29410
+ }
29411
+ });
29412
+
29053
29413
  // src/services/cli-auth/api-caller.ts
29054
29414
  var api_caller_exports = {};
29055
29415
  __export(api_caller_exports, {
@@ -29059,6 +29419,44 @@ __export(api_caller_exports, {
29059
29419
  executeChat: () => executeChat,
29060
29420
  executeCode: () => executeCode
29061
29421
  });
29422
+ function sanitizeLocalOutputText(raw) {
29423
+ let t2 = (raw || "").toString();
29424
+ const marker = "<|channel|>final<|message|>";
29425
+ const idx = t2.lastIndexOf(marker);
29426
+ if (idx >= 0) {
29427
+ let body = t2.substring(idx + marker.length);
29428
+ const endIdx = body.indexOf("<|end|>");
29429
+ if (endIdx >= 0) body = body.substring(0, endIdx);
29430
+ return body.trim();
29431
+ }
29432
+ return t2.replace(/<\|[^>]+?\|>/g, "").trim();
29433
+ }
29434
+ async function getEnterpriseFlag() {
29435
+ if (cachedEnterprise !== null) return cachedEnterprise;
29436
+ try {
29437
+ const tokens2 = await authManager2.getValidTokens();
29438
+ if (!tokens2) return false;
29439
+ const apiBase = process.env.MARIA_API_BASE || "https://api.maria-code.ai";
29440
+ const ctl = new AbortController();
29441
+ const to = setTimeout(() => ctl.abort(), 3e3);
29442
+ const r2 = await fetch(`${apiBase}/api/user/profile`, {
29443
+ method: "GET",
29444
+ headers: { "Authorization": `Bearer ${tokens2.accessToken}` }
29445
+ });
29446
+ clearTimeout(to);
29447
+ if (!r2.ok) {
29448
+ cachedEnterprise = false;
29449
+ return false;
29450
+ }
29451
+ const prof = await r2.json().catch(() => ({}));
29452
+ const plan = String((prof?.plan || "").toString()).toLowerCase();
29453
+ cachedEnterprise = plan === "enterprise";
29454
+ return cachedEnterprise;
29455
+ } catch {
29456
+ cachedEnterprise = false;
29457
+ return false;
29458
+ }
29459
+ }
29062
29460
  async function callAPI(endpoint, options = {}) {
29063
29461
  const tokens2 = await authManager2.getValidTokens();
29064
29462
  if (!tokens2) {
@@ -29066,6 +29464,93 @@ async function callAPI(endpoint, options = {}) {
29066
29464
  }
29067
29465
  const apiBase = process.env.MARIA_API_BASE || "https://api.maria-code.ai";
29068
29466
  const url2 = `${apiBase}${endpoint}`;
29467
+ try {
29468
+ const isLocalMode = process.env.LOCAL_MODE === "1";
29469
+ const isAiProxy = endpoint === "/v1/ai-proxy" && (options.method || "GET") === "POST";
29470
+ if (isAiProxy && (isLocalMode || true)) {
29471
+ const isEnterprisePlan = await getEnterpriseFlag().catch(() => false) || String(process.env.PLAN || "").toLowerCase() === "enterprise";
29472
+ if (!isLocalMode && !isEnterprisePlan) {
29473
+ } else {
29474
+ const payload = options.body || {};
29475
+ const reqProvider = String(payload?.provider || "").toLowerCase();
29476
+ if (isEnterprisePlan && reqProvider && !["lmstudio", "ollama"].includes(reqProvider)) {
29477
+ throw new Error("Enterprise policy requires local LLM only");
29478
+ }
29479
+ const explicitModel = typeof payload?.model === "string" ? payload.model : void 0;
29480
+ let effectivePrompt = void 0;
29481
+ if (typeof payload?.prompt === "string" && payload.prompt.trim()) {
29482
+ effectivePrompt = String(payload.prompt).trim();
29483
+ } else if (Array.isArray(payload?.messages)) {
29484
+ try {
29485
+ const lastUser = [...payload.messages].reverse().find((m2) => (m2?.role || "").toLowerCase() === "user");
29486
+ effectivePrompt = lastUser?.content && String(lastUser.content) || payload.messages.map((m2) => String(m2?.content || "")).filter(Boolean).join("\n");
29487
+ } catch {
29488
+ }
29489
+ }
29490
+ if (effectivePrompt && (!reqProvider || ["lmstudio", "ollama"].includes(reqProvider))) {
29491
+ try {
29492
+ let inlineProvider;
29493
+ let inlineModel;
29494
+ {
29495
+ const provMatch = /\s--provider=([a-zA-Z0-9_-]+)/i.exec(effectivePrompt);
29496
+ if (provMatch) inlineProvider = provMatch[1].toLowerCase();
29497
+ const modelMatch = /\s--model=([^\s]+)/i.exec(effectivePrompt);
29498
+ if (modelMatch) inlineModel = modelMatch[1];
29499
+ if (inlineProvider || inlineModel) {
29500
+ effectivePrompt = effectivePrompt.replace(/\s--provider=[^\s]+/ig, "").replace(/\s--model=[^\s]+/ig, "").trim();
29501
+ }
29502
+ }
29503
+ const { selectLocalProviderAndModel: selectLocalProviderAndModel2, generateViaCli: generateViaCli2 } = await Promise.resolve().then(() => (init_local_llm_manager(), local_llm_manager_exports));
29504
+ const sel = await selectLocalProviderAndModel2({ explicitModel: inlineModel || explicitModel, explicitProvider: inlineProvider });
29505
+ if (process.env.MARIA_DEBUG === "1" && sel) {
29506
+ try {
29507
+ console.log("[DEBUG/local] provider:", sel.provider, "model:", sel.model);
29508
+ } catch {
29509
+ }
29510
+ }
29511
+ if (sel) {
29512
+ const out = await generateViaCli2(sel.provider, sel.model, effectivePrompt);
29513
+ if (typeof out === "string" && out.length > 0) {
29514
+ const finalText = sanitizeLocalOutputText(out);
29515
+ if (process.env.MARIA_DEBUG === "1") {
29516
+ try {
29517
+ console.log("[DEBUG/local] sanitize", { inLen: out.length, outLen: finalText.length, changed: finalText.length !== out.length });
29518
+ } catch {
29519
+ }
29520
+ }
29521
+ try {
29522
+ const ctl = new AbortController();
29523
+ const to = setTimeout(() => ctl.abort(), 1500);
29524
+ await fetch(`${apiBase}/api/v1/usage`, {
29525
+ method: "POST",
29526
+ headers: {
29527
+ "Authorization": `Bearer ${tokens2.accessToken}`,
29528
+ "Content-Type": "application/json",
29529
+ "Idempotency-Key": `cli_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`
29530
+ },
29531
+ body: JSON.stringify({ consumption: { requests: 1 } }),
29532
+ signal: ctl.signal
29533
+ }).catch(() => null);
29534
+ clearTimeout(to);
29535
+ } catch {
29536
+ }
29537
+ return { data: { content: finalText, routedModel: { vendor: "local", family: sel.provider, name: sel.model, reason: isEnterprisePlan ? "enterprise" : "local_mode" } } };
29538
+ }
29539
+ }
29540
+ if (isEnterprisePlan) {
29541
+ throw new Error("Enterprise policy requires local LLM. Local execution failed or unavailable.");
29542
+ }
29543
+ } catch (e2) {
29544
+ if (isEnterprisePlan) throw e2;
29545
+ }
29546
+ } else if (isEnterprisePlan) {
29547
+ throw new Error("Enterprise policy requires local LLM only");
29548
+ }
29549
+ }
29550
+ }
29551
+ } catch (e2) {
29552
+ if (String(process.env.PLAN || "").toLowerCase() === "enterprise") throw e2;
29553
+ }
29069
29554
  const controller = new AbortController();
29070
29555
  const defaultMs = 6e5;
29071
29556
  const envMs = Number(process.env.MARIA_API_TIMEOUT_MS || process.env.MARIA_CODE_TIMEOUT_MS || defaultMs);
@@ -29225,12 +29710,13 @@ async function executeAIProxy(provider, model, messages, options) {
29225
29710
  body: { provider, model, messages, options }
29226
29711
  });
29227
29712
  }
29228
- var authManager2, RateLimitError;
29713
+ var authManager2, cachedEnterprise, RateLimitError;
29229
29714
  var init_api_caller = __esm({
29230
29715
  "src/services/cli-auth/api-caller.ts"() {
29231
29716
  init_AuthenticationManager();
29232
29717
  new https__default.default.Agent({ keepAlive: true });
29233
29718
  authManager2 = new AuthenticationManager();
29719
+ cachedEnterprise = null;
29234
29720
  RateLimitError = class extends Error {
29235
29721
  constructor(message, retryAfter) {
29236
29722
  super(message);
@@ -38009,7 +38495,23 @@ var init_telemetry_helper = __esm({
38009
38495
 
38010
38496
  // src/services/subscription/subscription-manager.ts
38011
38497
  async function getUserPlan() {
38012
- return "free";
38498
+ try {
38499
+ const { cliAuth: cliAuth2 } = await Promise.resolve().then(() => (init_CLIAuthService(), CLIAuthService_exports));
38500
+ const api = cliAuth2.getAPIClient();
38501
+ const usage = await api.getUsage();
38502
+ const raw = String(usage?.planCode || usage?.planName || "").toUpperCase();
38503
+ const normalized = raw.replace(/[-_](ANNUAL|MONTHLY|YEARLY)$/i, "").toUpperCase();
38504
+ try {
38505
+ process.env.MARIA_PLAN = raw;
38506
+ } catch {
38507
+ }
38508
+ if (normalized === "ENTERPRISE" || normalized === "ULTRA") return "ultra";
38509
+ if (normalized === "PRO") return "pro";
38510
+ if (normalized === "STARTER") return "starter";
38511
+ return "free";
38512
+ } catch {
38513
+ return "free";
38514
+ }
38013
38515
  }
38014
38516
  var init_subscription_manager = __esm({
38015
38517
  "src/services/subscription/subscription-manager.ts"() {
@@ -40640,18 +41142,18 @@ var init_StatusCommand = __esm({
40640
41142
  );
40641
41143
  if (process.env.NODE_ENV === "test") {
40642
41144
  if (timeoutMs < 200 || options.signal) {
40643
- const delay = Math.max(75, timeoutMs + 50);
41145
+ const delay2 = Math.max(75, timeoutMs + 50);
40644
41146
  systemHealthPromise = Promise.all([
40645
41147
  systemHealthPromise,
40646
- this.createCancellableDelay(delay, options.signal)
41148
+ this.createCancellableDelay(delay2, options.signal)
40647
41149
  ]).then(([health]) => health);
40648
41150
  } else {
40649
41151
  systemHealthPromise = systemHealthPromise.then((health) => {
40650
41152
  return new Promise((resolve19) => {
40651
41153
  if (!globalThis._statusCommandTestCounter)
40652
41154
  globalThis._statusCommandTestCounter = 0;
40653
- const delay = ++globalThis._statusCommandTestCounter % 2 === 1 ? 3 : 1;
40654
- setTimeout(() => resolve19(health), delay);
41155
+ const delay2 = ++globalThis._statusCommandTestCounter % 2 === 1 ? 3 : 1;
41156
+ setTimeout(() => resolve19(health), delay2);
40655
41157
  });
40656
41158
  });
40657
41159
  }
@@ -48613,13 +49115,13 @@ async function withRetry429(fn, opts) {
48613
49115
  const kind = classify(e2);
48614
49116
  if (!kind) throw e2;
48615
49117
  if (i2 === opts.retries) break;
48616
- const delay = backoffDelay(i2, opts);
49118
+ const delay2 = backoffDelay(i2, opts);
48617
49119
  try {
48618
- process.stderr.write(`WARN: ${kind} retry in ${delay}ms (attempt ${i2 + 1}/${opts.retries})
49120
+ process.stderr.write(`WARN: ${kind} retry in ${delay2}ms (attempt ${i2 + 1}/${opts.retries})
48619
49121
  `);
48620
49122
  } catch {
48621
49123
  }
48622
- await sleep2(delay);
49124
+ await sleep2(delay2);
48623
49125
  }
48624
49126
  }
48625
49127
  throw lastErr;
@@ -51505,7 +52007,7 @@ var init_about_command = __esm({
51505
52007
  async execute(args2, context2) {
51506
52008
  const output3 = [];
51507
52009
  output3.push("");
51508
- output3.push(chalk14__default.default.cyan.bold("About MARIA v4.4.2"));
52010
+ output3.push(chalk14__default.default.cyan.bold("About MARIA v4.4.3"));
51509
52011
  output3.push(chalk14__default.default.gray("\u2550".repeat(40)));
51510
52012
  output3.push("");
51511
52013
  output3.push(chalk14__default.default.white.bold("MARIA - Minimal API, Maximum Power"));
@@ -55917,16 +56419,16 @@ function countRemainingLines(hunks, startHunkIdx, currentPart, currentLine) {
55917
56419
  }
55918
56420
  function colorGreen(s2) {
55919
56421
  try {
55920
- const chalk44 = __require("chalk");
55921
- return chalk44.green(s2);
56422
+ const chalk46 = __require("chalk");
56423
+ return chalk46.green(s2);
55922
56424
  } catch {
55923
56425
  return s2;
55924
56426
  }
55925
56427
  }
55926
56428
  function colorRed(s2) {
55927
56429
  try {
55928
- const chalk44 = __require("chalk");
55929
- return chalk44.red(s2);
56430
+ const chalk46 = __require("chalk");
56431
+ return chalk46.red(s2);
55930
56432
  } catch {
55931
56433
  return s2;
55932
56434
  }
@@ -57415,9 +57917,9 @@ function emitTelemetry(ev) {
57415
57917
  }
57416
57918
  async function assertCleanWorkingTree() {
57417
57919
  try {
57418
- const { spawn: spawn4 } = await import('child_process');
57920
+ const { spawn: spawn5 } = await import('child_process');
57419
57921
  const run = (cmd, args2) => new Promise((resolve19) => {
57420
- const p = spawn4(cmd, args2, { stdio: "ignore" });
57922
+ const p = spawn5(cmd, args2, { stdio: "ignore" });
57421
57923
  p.on("close", (code) => resolve19(code ?? 0));
57422
57924
  p.on("error", () => resolve19(1));
57423
57925
  });
@@ -57432,15 +57934,15 @@ async function assertCleanWorkingTree() {
57432
57934
  }
57433
57935
  async function gitSingleCommit(appliedCount, opts) {
57434
57936
  try {
57435
- const { spawn: spawn4 } = await import('child_process');
57937
+ const { spawn: spawn5 } = await import('child_process');
57436
57938
  const run = (cmd, args2) => new Promise((resolve19) => {
57437
- const p = spawn4(cmd, args2, { stdio: "ignore" });
57939
+ const p = spawn5(cmd, args2, { stdio: "ignore" });
57438
57940
  p.on("close", (code2) => resolve19(code2 ?? 0));
57439
57941
  p.on("error", () => resolve19(1));
57440
57942
  });
57441
57943
  const runOut = (cmd, args2) => new Promise((resolve19) => {
57442
57944
  const chunks = [];
57443
- const p = spawn4(cmd, args2, { stdio: ["ignore", "pipe", "ignore"] });
57945
+ const p = spawn5(cmd, args2, { stdio: ["ignore", "pipe", "ignore"] });
57444
57946
  p.stdout.on("data", (c) => chunks.push(c));
57445
57947
  p.on("close", () => resolve19(Buffer.concat(chunks).toString().trim()));
57446
57948
  p.on("error", () => resolve19(""));
@@ -57478,10 +57980,10 @@ async function gitSingleCommit(appliedCount, opts) {
57478
57980
  }
57479
57981
  async function buildAutoTag(prefix) {
57480
57982
  try {
57481
- const { spawn: spawn4 } = await import('child_process');
57983
+ const { spawn: spawn5 } = await import('child_process');
57482
57984
  const runOut = (cmd, args2) => new Promise((resolve19) => {
57483
57985
  const chunks = [];
57484
- const p = spawn4(cmd, args2, { stdio: ["ignore", "pipe", "ignore"] });
57986
+ const p = spawn5(cmd, args2, { stdio: ["ignore", "pipe", "ignore"] });
57485
57987
  p.stdout.on("data", (c) => chunks.push(c));
57486
57988
  p.on("close", () => resolve19(Buffer.concat(chunks).toString().trim()));
57487
57989
  p.on("error", () => resolve19(""));
@@ -59589,12 +60091,12 @@ async function scanRoot(opts) {
59589
60091
  const filepath = path12__namespace.join(cwd2, name2);
59590
60092
  const result = await safeRead(filepath, 512 * 1024, maxLines, signal);
59591
60093
  if (result.head || result.meta) {
59592
- let meta27 = result.meta || object;
60094
+ let meta28 = result.meta || object;
59593
60095
  if (name2 === "package.json" && result.head) {
59594
60096
  try {
59595
60097
  const pkg = JSON.parse(result.head);
59596
- meta27 = {
59597
- ...meta27,
60098
+ meta28 = {
60099
+ ...meta28,
59598
60100
  name: pkg.name,
59599
60101
  version: pkg.version,
59600
60102
  type: pkg.type,
@@ -59607,14 +60109,14 @@ async function scanRoot(opts) {
59607
60109
  workspaces: pkg.workspaces
59608
60110
  };
59609
60111
  } catch (e2) {
59610
- meta27.parseError = true;
60112
+ meta28.parseError = true;
59611
60113
  }
59612
60114
  }
59613
60115
  findings.push({
59614
60116
  file: name2,
59615
60117
  kind: "read",
59616
60118
  head: result.head,
59617
- meta: meta27,
60119
+ meta: meta28,
59618
60120
  truncated: result.truncated
59619
60121
  });
59620
60122
  }
@@ -59952,19 +60454,19 @@ function extractPackageInfo(findings) {
59952
60454
  hasPostinstall: false
59953
60455
  };
59954
60456
  }
59955
- const meta27 = pkgFinding.meta;
60457
+ const meta28 = pkgFinding.meta;
59956
60458
  return {
59957
- name: meta27.name,
59958
- version: meta27.version,
59959
- type: meta27.type,
59960
- scripts: meta27.scripts ? Object.keys(meta27.scripts) : [],
59961
- hasPostinstall: !!meta27.scripts?.postinstall,
59962
- bin: meta27.bin,
59963
- main: meta27.main,
59964
- exports: meta27.exports,
59965
- dependencies: meta27.dependencies || [],
59966
- devDependencies: meta27.devDependencies || [],
59967
- workspaces: meta27.workspaces
60459
+ name: meta28.name,
60460
+ version: meta28.version,
60461
+ type: meta28.type,
60462
+ scripts: meta28.scripts ? Object.keys(meta28.scripts) : [],
60463
+ hasPostinstall: !!meta28.scripts?.postinstall,
60464
+ bin: meta28.bin,
60465
+ main: meta28.main,
60466
+ exports: meta28.exports,
60467
+ dependencies: meta28.dependencies || [],
60468
+ devDependencies: meta28.devDependencies || [],
60469
+ workspaces: meta28.workspaces
59968
60470
  };
59969
60471
  }
59970
60472
  function collectWarnings(pkg, findings, cwd2) {
@@ -60115,9 +60617,9 @@ function calculateMetrics(findings, startTime) {
60115
60617
  }
60116
60618
  function renderFinding(f3) {
60117
60619
  const title = `### ${f3.kind.toUpperCase()} \u2014 ${f3.file}`;
60118
- let meta27 = "";
60620
+ let meta28 = "";
60119
60621
  if (f3.meta && Object.keys(f3.meta).length > 0) {
60120
- meta27 = `
60622
+ meta28 = `
60121
60623
  <details><summary>meta</summary>
60122
60624
 
60123
60625
  \`\`\`json
@@ -60138,7 +60640,7 @@ ${f3.head.trim()}
60138
60640
  }
60139
60641
  const truncInfo = f3.truncated ? `
60140
60642
  > _truncated preview_` : "";
60141
- return [title, meta27, content, truncInfo, ""].join("\n");
60643
+ return [title, meta28, content, truncInfo, ""].join("\n");
60142
60644
  }
60143
60645
  function safeJsonStringify(obj) {
60144
60646
  try {
@@ -70853,11 +71355,11 @@ var init_search_command = __esm({
70853
71355
  * Calculate processing delay for simulation
70854
71356
  */
70855
71357
  calculateProcessingDelay(options) {
70856
- let delay = 100;
70857
- if (options.kgBoost) delay += 50;
70858
- if (options.rerank) delay += 100;
70859
- if (options.explain) delay += 30;
70860
- return delay + Math.random() * 50;
71358
+ let delay2 = 100;
71359
+ if (options.kgBoost) delay2 += 50;
71360
+ if (options.rerank) delay2 += 100;
71361
+ if (options.explain) delay2 += 30;
71362
+ return delay2 + Math.random() * 50;
70861
71363
  }
70862
71364
  /**
70863
71365
  * Generate mock search results
@@ -72935,6 +73437,592 @@ var init_gpu_command = __esm({
72935
73437
  gpu_command_default = GPUCommand;
72936
73438
  }
72937
73439
  });
73440
+ function renderFeatureComparison() {
73441
+ const lines = [];
73442
+ const COLS = {
73443
+ feature: 28,
73444
+ free: 9,
73445
+ starter: 15,
73446
+ pro: 20,
73447
+ ultra: 20
73448
+ };
73449
+ const stripAnsi2 = (s2) => s2.replace(/\x1B\[[0-9;]*m/g, "");
73450
+ const padAnsi = (s2, width) => {
73451
+ const len = stripAnsi2(s2).length;
73452
+ return s2 + " ".repeat(Math.max(0, width - len));
73453
+ };
73454
+ lines.push("");
73455
+ lines.push(chalk14__default.default.bold.white("\u{1F4CA} Plan Comparison"));
73456
+ lines.push("");
73457
+ lines.push(chalk14__default.default.gray("\u2500".repeat(60)));
73458
+ lines.push("");
73459
+ lines.push(
73460
+ " " + padAnsi(chalk14__default.default.gray.bold("Feature"), COLS.feature) + padAnsi(chalk14__default.default.bold("FREE"), COLS.free) + " " + padAnsi(chalk14__default.default.blue.bold("STARTER"), COLS.starter) + " " + padAnsi(chalk14__default.default.yellow.bold("PRO"), COLS.pro) + " " + padAnsi(chalk14__default.default.magenta.bold("ULTRA"), COLS.ultra)
73461
+ );
73462
+ lines.push("");
73463
+ const features = [
73464
+ // LP-aligned buckets
73465
+ ["Code Generation/month", "40", "300", "1,200", "5,000"],
73466
+ ["File Analysis/month", "5", "50", "200", "500"],
73467
+ ["AI Models", "3 models", "4 models", "6 models", "12 models"],
73468
+ ["Support", "Community", "Community", "Community", "Priority"]
73469
+ ];
73470
+ for (const [feature, free, starter, pro, ultra] of features) {
73471
+ const line = " " + padAnsi(feature, COLS.feature) + padAnsi(formatValue(free), COLS.free) + " " + padAnsi(formatValue(starter, "blue"), COLS.starter) + " " + padAnsi(formatValue(pro, "yellow"), COLS.pro) + " " + padAnsi(formatValue(ultra, "magenta"), COLS.ultra);
73472
+ lines.push(line);
73473
+ }
73474
+ lines.push("");
73475
+ lines.push(chalk14__default.default.gray("\u2500".repeat(60)));
73476
+ lines.push("");
73477
+ lines.push(chalk14__default.default.cyan(" \u{1F48E} Upgrade: /upgrade"));
73478
+ lines.push("");
73479
+ return lines.join("\n");
73480
+ }
73481
+ function formatValue(value, color) {
73482
+ if (value === "\u274C") return chalk14__default.default.red(value);
73483
+ if (value === "\u2705") return chalk14__default.default.green(value);
73484
+ if (value === "Unlimited") {
73485
+ return color === "magenta" ? chalk14__default.default.magenta.bold(value) : chalk14__default.default.bold(value);
73486
+ }
73487
+ switch (color) {
73488
+ case "blue":
73489
+ return chalk14__default.default.blue(value);
73490
+ case "yellow":
73491
+ return chalk14__default.default.yellow(value);
73492
+ case "magenta":
73493
+ return chalk14__default.default.magenta(value);
73494
+ default:
73495
+ return chalk14__default.default.white(value);
73496
+ }
73497
+ }
73498
+ var init_plan_aware_ui = __esm({
73499
+ "src/ui/components/plan-aware-ui.ts"() {
73500
+ }
73501
+ });
73502
+
73503
+ // src/slash-commands/categories/system/upgrade.command.ts
73504
+ var upgrade_command_exports = {};
73505
+ __export(upgrade_command_exports, {
73506
+ UpgradeCommand: () => UpgradeCommand,
73507
+ meta: () => meta26
73508
+ });
73509
+ var UpgradeCommand, meta26;
73510
+ var init_upgrade_command = __esm({
73511
+ "src/slash-commands/categories/system/upgrade.command.ts"() {
73512
+ init_base_command();
73513
+ init_plan_aware_ui();
73514
+ init_subscription_manager();
73515
+ UpgradeCommand = class extends BaseCommand {
73516
+ name = "upgrade";
73517
+ description = "Upgrade your subscription plan";
73518
+ category = "system";
73519
+ aliases = ["pro", "ultra", "premium", "subscribe"];
73520
+ async execute(args2, context2) {
73521
+ Array.isArray(args2?.raw) ? args2.raw : [];
73522
+ const positional = args2?.parsed?.positional;
73523
+ const firstPositional = Array.isArray(positional) && positional.length > 0 ? positional[0] : void 0;
73524
+ const planOpt = args2?.options?.plan;
73525
+ const compareFlag = Boolean(args2?.flags?.compare);
73526
+ const plan = (planOpt || firstPositional)?.trim();
73527
+ const contextPlan = String(context2?.user?.plan || "").toUpperCase();
73528
+ const mappedFromContext = this.mapContextPlanToInternal(contextPlan);
73529
+ let currentPlan = mappedFromContext || await getUserPlan();
73530
+ if (compareFlag) {
73531
+ return {
73532
+ success: true,
73533
+ message: renderFeatureComparison(),
73534
+ requiresInput: false,
73535
+ autoRetry: false
73536
+ };
73537
+ }
73538
+ if (!plan) {
73539
+ return this.showInteractiveUpgrade(currentPlan, contextPlan);
73540
+ }
73541
+ let isAuthenticated = Boolean(context2?.user);
73542
+ try {
73543
+ if (!isAuthenticated) {
73544
+ const { cliAuth: cliAuth2 } = await Promise.resolve().then(() => (init_CLIAuthService(), CLIAuthService_exports));
73545
+ isAuthenticated = await cliAuth2.getAuthClient().isAuthenticated();
73546
+ }
73547
+ } catch {
73548
+ }
73549
+ if (!isAuthenticated) {
73550
+ return {
73551
+ success: false,
73552
+ message: "\u{1F510} Authentication required \xB7 Run: /login",
73553
+ requiresInput: false,
73554
+ autoRetry: false
73555
+ };
73556
+ }
73557
+ const normalizedPlan = plan.trim().toLowerCase();
73558
+ if (!["starter", "pro", "ultra"].includes(normalizedPlan)) {
73559
+ return {
73560
+ success: false,
73561
+ message: `Invalid plan: ${plan}. Choose 'starter', 'pro' or 'ultra'.`,
73562
+ requiresInput: false,
73563
+ autoRetry: false
73564
+ };
73565
+ }
73566
+ return this.processUpgrade(currentPlan, normalizedPlan, contextPlan, isAuthenticated, context2);
73567
+ }
73568
+ mapContextPlanToInternal(contextPlanUpper) {
73569
+ const code = contextPlanUpper.replace(/[-_](ANNUAL|MONTHLY|YEARLY)$/i, "").toUpperCase();
73570
+ if (code.includes("ENTERPRISE")) return "ultra";
73571
+ if (code.includes("ULTRA")) return "ultra";
73572
+ if (code.includes("PRO")) return "pro";
73573
+ if (code.includes("STARTER")) return "starter";
73574
+ if (code.includes("FREE")) return "free";
73575
+ return void 0;
73576
+ }
73577
+ async showInteractiveUpgrade(currentPlan, contextPlanUpper) {
73578
+ const output3 = [];
73579
+ output3.push("");
73580
+ output3.push(chalk14__default.default.bold.cyan("\u{1F48E} Upgrade Your Plan"));
73581
+ output3.push("");
73582
+ output3.push(chalk14__default.default.gray("Current Plan: ") + this.getCurrentPlanLabel(currentPlan, contextPlanUpper));
73583
+ output3.push("");
73584
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73585
+ output3.push("");
73586
+ if (currentPlan === "free") {
73587
+ output3.push(chalk14__default.default.bold.white("\u{1F539} STARTER - $20/month"));
73588
+ output3.push(chalk14__default.default.gray("For individual developers"));
73589
+ output3.push("");
73590
+ output3.push(" \u2705 Advanced AI Chat");
73591
+ output3.push(" \u2705 Code Generation (300/month)");
73592
+ output3.push(" \u2705 50 file analysis/month");
73593
+ output3.push(" \u2705 4 AI models");
73594
+ output3.push(" \u2705 Community support");
73595
+ output3.push("");
73596
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade starter"));
73597
+ output3.push("");
73598
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73599
+ output3.push("");
73600
+ output3.push(chalk14__default.default.bold.yellow("\u{1F31F} PRO - $39/month"));
73601
+ output3.push(chalk14__default.default.gray("For serious developers"));
73602
+ output3.push("");
73603
+ output3.push(" \u2705 Pro AI Chat");
73604
+ output3.push(" \u2705 Advanced Code Generation (1,200/month)");
73605
+ output3.push(" \u2705 200 file analysis/month");
73606
+ output3.push(" \u2705 6 AI models");
73607
+ output3.push(" \u2705 Community support");
73608
+ output3.push(" \u2705 API Access");
73609
+ output3.push("");
73610
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade pro"));
73611
+ output3.push("");
73612
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73613
+ output3.push("");
73614
+ output3.push(chalk14__default.default.bold.magenta("\u{1F680} ULTRA - $99/month"));
73615
+ output3.push(chalk14__default.default.gray("For power users and teams"));
73616
+ output3.push("");
73617
+ output3.push(" \u2705 Executive AI Chat");
73618
+ output3.push(" \u2705 Professional Code Generation (5,000/month)");
73619
+ output3.push(" \u2705 500 file analysis/month");
73620
+ output3.push(" \u2705 12 AI models");
73621
+ output3.push(" \u2705 Priority support");
73622
+ output3.push(" \u2705 API Access");
73623
+ output3.push("");
73624
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade ultra"));
73625
+ } else if (currentPlan === "starter") {
73626
+ output3.push(chalk14__default.default.bold.yellow("\u{1F31F} Upgrade to PRO - $39/month"));
73627
+ output3.push("");
73628
+ output3.push(" \u2705 Pro AI Chat");
73629
+ output3.push(" \u2705 Advanced Code Generation (1,200/month)");
73630
+ output3.push(" \u2705 200 file analysis/month");
73631
+ output3.push(" \u2705 6 AI models");
73632
+ output3.push(" \u2705 Community support");
73633
+ output3.push(" \u2705 API Access");
73634
+ output3.push("");
73635
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade pro"));
73636
+ output3.push("");
73637
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73638
+ output3.push("");
73639
+ output3.push(chalk14__default.default.bold.magenta("\u{1F680} Upgrade to ULTRA - $99/month"));
73640
+ output3.push("");
73641
+ output3.push(" \u2705 Executive AI Chat");
73642
+ output3.push(" \u2705 Professional Code Generation (5,000/month)");
73643
+ output3.push(" \u2705 500 file analysis/month");
73644
+ output3.push(" \u2705 12 AI models");
73645
+ output3.push(" \u2705 Priority support");
73646
+ output3.push(" \u2705 API Access");
73647
+ output3.push("");
73648
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade ultra"));
73649
+ } else if (currentPlan === "pro") {
73650
+ output3.push(chalk14__default.default.bold.magenta("\u{1F680} Upgrade to ULTRA - $99/month"));
73651
+ output3.push("");
73652
+ output3.push(" \u2705 Executive AI Chat");
73653
+ output3.push(" \u2705 Professional Code Generation (5,000/month)");
73654
+ output3.push(" \u2705 500 file analysis/month");
73655
+ output3.push(" \u2705 12 AI models + Local LLM");
73656
+ output3.push(" \u2705 Priority support");
73657
+ output3.push("");
73658
+ output3.push(chalk14__default.default.cyan(" Upgrade: /upgrade ultra"));
73659
+ } else {
73660
+ output3.push(chalk14__default.default.green(`\u2728 You have the ${this.getTopTierLabel(contextPlanUpper)} plan!`));
73661
+ output3.push("");
73662
+ output3.push("You already have access to all features:");
73663
+ output3.push(" \u2022 Maximum rate limits");
73664
+ output3.push(" \u2022 All premium features");
73665
+ output3.push(" \u2022 Priority support");
73666
+ }
73667
+ output3.push("");
73668
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73669
+ output3.push("");
73670
+ output3.push(chalk14__default.default.gray("Compare all plans: /upgrade --compare"));
73671
+ output3.push("");
73672
+ return {
73673
+ success: true,
73674
+ message: output3.join("\n"),
73675
+ requiresInput: false,
73676
+ autoRetry: false
73677
+ };
73678
+ }
73679
+ async processUpgrade(currentPlan, targetPlan, contextPlanUpper, isAuthenticated, context2) {
73680
+ const output3 = [];
73681
+ const planHierarchy = {
73682
+ free: 0,
73683
+ starter: 1,
73684
+ pro: 2,
73685
+ ultra: 3
73686
+ };
73687
+ if (planHierarchy[targetPlan] <= planHierarchy[currentPlan]) {
73688
+ output3.push("");
73689
+ output3.push(chalk14__default.default.yellow("\u26A0\uFE0F Invalid Upgrade"));
73690
+ output3.push("");
73691
+ output3.push(`You already have the ${this.getCurrentPlanLabel(currentPlan, contextPlanUpper)} plan.`);
73692
+ if (currentPlan === "ultra" || String(contextPlanUpper || "").toUpperCase() === "ENTERPRISE") {
73693
+ output3.push("You have access to all features!");
73694
+ } else {
73695
+ output3.push(`Consider upgrading to ${targetPlan === "pro" ? "ULTRA" : "a higher plan"} for more features.`);
73696
+ }
73697
+ output3.push("");
73698
+ return {
73699
+ success: true,
73700
+ message: output3.join("\n"),
73701
+ requiresInput: false,
73702
+ autoRetry: false
73703
+ };
73704
+ }
73705
+ output3.push("");
73706
+ output3.push(chalk14__default.default.cyan("\u{1F504} Processing upgrade..."));
73707
+ output3.push("");
73708
+ output3.push(`From: ${this.getPlanBadge(currentPlan)}`);
73709
+ output3.push(`To: ${this.getPlanBadge(targetPlan)}`);
73710
+ output3.push("");
73711
+ output3.push(chalk14__default.default.gray("Opening browser for billing..."));
73712
+ output3.push("");
73713
+ let upgraded = false;
73714
+ let changedTo = null;
73715
+ try {
73716
+ const base = process.env.MARIA_API_URL || "https://maria-code.ai";
73717
+ const startCliReturnServer = async () => {
73718
+ const callbackPort = 65434;
73719
+ const callbackPath = "/cli-return";
73720
+ const http4 = await import('http');
73721
+ return new Promise((resolve19) => {
73722
+ let finished = false;
73723
+ const server = http4.createServer(async (req, res) => {
73724
+ try {
73725
+ const method = (req.method || "GET").toUpperCase();
73726
+ let status;
73727
+ let plan;
73728
+ const urlStr = `http://localhost${req.url || ""}`;
73729
+ const u = new URL(urlStr);
73730
+ if (u.pathname === callbackPath) {
73731
+ status = u.searchParams.get("status") || void 0;
73732
+ plan = u.searchParams.get("plan") || void 0;
73733
+ if (method === "POST") {
73734
+ const chunks = [];
73735
+ await new Promise((r2) => {
73736
+ req.on("data", (c) => {
73737
+ if (chunks.join("").length < 8192) chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(String(c)));
73738
+ });
73739
+ req.on("end", () => r2());
73740
+ });
73741
+ const body = Buffer.concat(chunks).toString("utf8");
73742
+ try {
73743
+ const params2 = new URLSearchParams(body);
73744
+ status = params2.get("status") || status;
73745
+ plan = params2.get("plan") || plan;
73746
+ } catch {
73747
+ }
73748
+ }
73749
+ if (process.env.MARIA_DEBUG === "1") {
73750
+ try {
73751
+ console.error("[MARIA DEBUG] CLI return inbound", { method, status, plan });
73752
+ } catch {
73753
+ }
73754
+ }
73755
+ res.writeHead(200, { "Content-Type": "text/html" });
73756
+ res.end('<html><body style="font-family:system-ui;padding:24px;text-align:center">OK. You can close this window.</body></html>');
73757
+ if (!finished && status === "success") {
73758
+ finished = true;
73759
+ setTimeout(() => {
73760
+ try {
73761
+ server.close();
73762
+ } catch {
73763
+ }
73764
+ resolve19({ status, plan });
73765
+ }, 10);
73766
+ }
73767
+ return;
73768
+ }
73769
+ } catch {
73770
+ }
73771
+ res.statusCode = 404;
73772
+ res.end("");
73773
+ });
73774
+ const timer = setTimeout(() => {
73775
+ if (!finished) {
73776
+ finished = true;
73777
+ try {
73778
+ server.close();
73779
+ } catch {
73780
+ }
73781
+ resolve19(null);
73782
+ }
73783
+ }, 18e4);
73784
+ server.listen(callbackPort, "127.0.0.1", () => {
73785
+ if (process.env.MARIA_DEBUG === "1") {
73786
+ try {
73787
+ console.error("[MARIA DEBUG] CLI return server listening", { port: callbackPort, path: callbackPath });
73788
+ } catch {
73789
+ }
73790
+ }
73791
+ });
73792
+ server.on("close", () => {
73793
+ clearTimeout(timer);
73794
+ });
73795
+ });
73796
+ };
73797
+ const cliReturnUrl = `http://localhost:65434/cli-return`;
73798
+ const targetUrl = `${base}/manage?upgrade=${encodeURIComponent(targetPlan)}&auto=1&cliReturn=${encodeURIComponent(cliReturnUrl)}`;
73799
+ const { openUrl: openUrl2 } = await Promise.resolve().then(() => (init_open_url(), open_url_exports));
73800
+ if (process.env.MARIA_DEBUG === "1") {
73801
+ console.error("[MARIA DEBUG] Open manage URL", { url: targetUrl });
73802
+ }
73803
+ const cliReturnPromise = startCliReturnServer();
73804
+ await openUrl2(targetUrl);
73805
+ try {
73806
+ const cb = await cliReturnPromise;
73807
+ if (cb && (cb.status === "success" || cb.status === "scheduled")) {
73808
+ const p = String(cb.plan || "").toLowerCase();
73809
+ if (p === "starter" || p === "pro" || p === "ultra") {
73810
+ if (cb.status === "success") {
73811
+ changedTo = p;
73812
+ upgraded = true;
73813
+ } else {
73814
+ changedTo = p;
73815
+ }
73816
+ if (process.env.MARIA_DEBUG === "1") {
73817
+ try {
73818
+ console.error("[MARIA DEBUG] LP callback received", { plan: p, status: cb.status });
73819
+ } catch {
73820
+ }
73821
+ }
73822
+ }
73823
+ }
73824
+ } catch {
73825
+ }
73826
+ try {
73827
+ const { cliAuth: cliAuth2 } = await Promise.resolve().then(() => (init_CLIAuthService(), CLIAuthService_exports));
73828
+ const { MariaAPIClient: MariaAPIClient2 } = await Promise.resolve().then(() => (init_MariaAPIClient(), MariaAPIClient_exports));
73829
+ const api = new MariaAPIClient2({
73830
+ baseUrl: "https://api.maria-code.ai",
73831
+ timeout: 3e4,
73832
+ retryAttempts: 3
73833
+ }, cliAuth2.getAuthClient());
73834
+ if (!isAuthenticated || upgraded) {
73835
+ if (process.env.MARIA_DEBUG === "1") {
73836
+ console.error("[MARIA DEBUG] Skip plan polling (no context.user)");
73837
+ }
73838
+ throw new Error("SKIP_POLLING_UNAUTHENTICATED");
73839
+ }
73840
+ const normalize3 = (v) => String(v).toLowerCase().replace(/-annual|-monthly|-yearly$/i, "");
73841
+ const targetNorm = normalize3(targetPlan);
73842
+ const initialNorm = normalize3(currentPlan);
73843
+ const start = Date.now();
73844
+ const timeoutMs = 6e5;
73845
+ const intervalMs = 3e3;
73846
+ while (Date.now() - start < timeoutMs) {
73847
+ await new Promise((r2) => setTimeout(r2, intervalMs));
73848
+ try {
73849
+ const usage = await api.getUsage();
73850
+ const code = String(usage?.planCode || usage?.planName || "").toLowerCase();
73851
+ const norm = normalize3(code);
73852
+ if (process.env.MARIA_DEBUG === "1") {
73853
+ try {
73854
+ console.error("[MARIA DEBUG] Poll tick", { endpoint: "GET /api/v1/usage", planCode: usage?.planCode, planName: usage?.planName, norm, initialNorm, targetNorm });
73855
+ } catch {
73856
+ }
73857
+ }
73858
+ if (norm !== initialNorm) {
73859
+ if (norm === "starter" || norm === "pro" || norm === "ultra") {
73860
+ changedTo = norm;
73861
+ } else {
73862
+ if (norm.includes("enterprise")) changedTo = "ultra";
73863
+ }
73864
+ if (changedTo) {
73865
+ upgraded = true;
73866
+ if (process.env.MARIA_DEBUG === "1") {
73867
+ try {
73868
+ console.error("[MARIA DEBUG] Plan change detected", { changedTo });
73869
+ } catch {
73870
+ }
73871
+ }
73872
+ break;
73873
+ }
73874
+ }
73875
+ } catch (pollErr) {
73876
+ if (process.env.MARIA_DEBUG === "1") {
73877
+ const e2 = pollErr;
73878
+ try {
73879
+ console.error("[MARIA DEBUG] Plan poll failed", { error: String(e2?.message || e2), stack: e2?.stack, name: e2?.name });
73880
+ } catch {
73881
+ }
73882
+ }
73883
+ const msg = String(pollErr?.message || pollErr);
73884
+ if (msg.includes("Authentication required")) {
73885
+ if (process.env.MARIA_DEBUG === "1") {
73886
+ try {
73887
+ console.error("[MARIA DEBUG] Stop polling due to auth error");
73888
+ } catch {
73889
+ }
73890
+ }
73891
+ break;
73892
+ }
73893
+ }
73894
+ }
73895
+ } catch (pollSetupErr) {
73896
+ const msg = String(pollSetupErr?.message || pollSetupErr);
73897
+ if (process.env.MARIA_DEBUG === "1" && msg !== "SKIP_POLLING_UNAUTHENTICATED") {
73898
+ console.error("[MARIA DEBUG] Plan polling setup failed", { error: msg });
73899
+ }
73900
+ }
73901
+ } catch (e2) {
73902
+ if (process.env.MARIA_DEBUG === "1") {
73903
+ console.error("[MARIA DEBUG] Failed to open manage URL", { error: String(e2?.message || e2) });
73904
+ }
73905
+ upgraded = false;
73906
+ }
73907
+ if (upgraded && changedTo) {
73908
+ output3.push(chalk14__default.default.green("\u2705 Upgrade Successful!"));
73909
+ output3.push("");
73910
+ output3.push(`Welcome to ${this.getPlanBadge(changedTo)}!`);
73911
+ output3.push("");
73912
+ const planToDescribe = changedTo;
73913
+ if (planToDescribe === "starter") {
73914
+ output3.push("You now have access to:");
73915
+ output3.push(" \u2022 Advanced AI Chat");
73916
+ output3.push(" \u2022 Code Generation (300/month)");
73917
+ output3.push(" \u2022 50 file analysis/month");
73918
+ output3.push(" \u2022 4 AI models");
73919
+ output3.push(" \u2022 Community support");
73920
+ } else if (planToDescribe === "pro") {
73921
+ output3.push("You now have access to:");
73922
+ output3.push(" \u2022 Pro AI Chat");
73923
+ output3.push(" \u2022 Advanced Code Generation (1,200/month)");
73924
+ output3.push(" \u2022 200 file analysis/month");
73925
+ output3.push(" \u2022 6 AI models");
73926
+ output3.push(" \u2022 Community support");
73927
+ output3.push(" \u2022 API Access");
73928
+ } else if (planToDescribe === "ultra") {
73929
+ output3.push("You now have access to:");
73930
+ output3.push(" \u2022 Executive AI Chat");
73931
+ output3.push(" \u2022 Professional Code Generation (5,000/month)");
73932
+ output3.push(" \u2022 500 file analysis/month");
73933
+ output3.push(" \u2022 12 AI models");
73934
+ output3.push(" \u2022 Priority support");
73935
+ output3.push(" \u2022 API Access");
73936
+ }
73937
+ output3.push("");
73938
+ output3.push(chalk14__default.default.cyan("Try your new features (after billing completes):"));
73939
+ output3.push(' /code "Refactor module"');
73940
+ output3.push(' /image "logo in matrix style"');
73941
+ output3.push(' /video "product teaser"');
73942
+ output3.push("");
73943
+ } else {
73944
+ output3.push(chalk14__default.default.yellow("\u23F3 Billing in progress"));
73945
+ output3.push("");
73946
+ output3.push("The billing portal or checkout was opened in your browser.");
73947
+ output3.push("We did not detect a plan change yet. Complete the process and run /whoami to verify.");
73948
+ }
73949
+ try {
73950
+ const { WhoAmICommand: WhoAmICommand2 } = await Promise.resolve().then(() => (init_WhoAmICommand(), WhoAmICommand_exports));
73951
+ const whoami = new WhoAmICommand2();
73952
+ const who = await whoami.execute({}, context2);
73953
+ if (who?.message) {
73954
+ output3.push("");
73955
+ output3.push(chalk14__default.default.gray("\u2500".repeat(60)));
73956
+ output3.push("");
73957
+ output3.push(chalk14__default.default.cyan("Current account status"));
73958
+ output3.push(who.message);
73959
+ }
73960
+ } catch {
73961
+ }
73962
+ return {
73963
+ success: upgraded,
73964
+ message: output3.join("\n"),
73965
+ requiresInput: false,
73966
+ autoRetry: false
73967
+ };
73968
+ }
73969
+ getPlanBadge(plan) {
73970
+ const badges = {
73971
+ free: chalk14__default.default.gray("[FREE]"),
73972
+ starter: chalk14__default.default.bgBlue.black(" STARTER "),
73973
+ pro: chalk14__default.default.bgYellow.black(" PRO "),
73974
+ ultra: chalk14__default.default.bgMagenta.white(" ULTRA ")
73975
+ };
73976
+ return badges[plan];
73977
+ }
73978
+ getCurrentPlanLabel(plan, contextPlanUpper) {
73979
+ try {
73980
+ if (String(contextPlanUpper || "").toUpperCase() === "ENTERPRISE") {
73981
+ return chalk14__default.default.bgMagenta.white(" ENTERPRISE ");
73982
+ }
73983
+ const envPlan = String(process.env.MARIA_PLAN || "").toUpperCase();
73984
+ if (envPlan === "ENTERPRISE") return chalk14__default.default.bgMagenta.white(" ENTERPRISE ");
73985
+ } catch {
73986
+ }
73987
+ return this.getPlanBadge(plan);
73988
+ }
73989
+ getTopTierLabel(contextPlanUpper) {
73990
+ try {
73991
+ if (String(contextPlanUpper || "").toUpperCase() === "ENTERPRISE") {
73992
+ return "ENTERPRISE";
73993
+ }
73994
+ const envPlan = String(process.env.MARIA_PLAN || "").toUpperCase();
73995
+ if (envPlan === "ENTERPRISE") return "ENTERPRISE";
73996
+ } catch {
73997
+ }
73998
+ return "ULTRA";
73999
+ }
74000
+ async handleError(error2) {
74001
+ return {
74002
+ success: false,
74003
+ message: `Failed to process upgrade: ${error2.message}`,
74004
+ requiresInput: false,
74005
+ autoRetry: false
74006
+ };
74007
+ }
74008
+ };
74009
+ meta26 = {
74010
+ name: "upgrade",
74011
+ category: "system",
74012
+ description: "Upgrade your subscription plan",
74013
+ aliases: ["pro", "ultra", "premium", "subscribe"],
74014
+ usage: "/upgrade [starter|pro|ultra] [--compare]",
74015
+ examples: [
74016
+ "/upgrade",
74017
+ "/upgrade starter",
74018
+ "/upgrade pro",
74019
+ "/upgrade ultra",
74020
+ "/upgrade --compare"
74021
+ ],
74022
+ deps: []
74023
+ };
74024
+ }
74025
+ });
72938
74026
  var CriteriaManager;
72939
74027
  var init_CriteriaManager = __esm({
72940
74028
  "src/services/evaluation/CriteriaManager.ts"() {
@@ -73446,9 +74534,9 @@ var evaluate_command_exports = {};
73446
74534
  __export(evaluate_command_exports, {
73447
74535
  EvaluateCommand: () => EvaluateCommand,
73448
74536
  default: () => evaluate_command_default,
73449
- meta: () => meta26
74537
+ meta: () => meta27
73450
74538
  });
73451
- var EvaluateCommand, meta26, evaluate_command_default;
74539
+ var EvaluateCommand, meta27, evaluate_command_default;
73452
74540
  var init_evaluate_command = __esm({
73453
74541
  "src/slash-commands/categories/evaluation/evaluate.command.ts"() {
73454
74542
  init_base_command();
@@ -74174,7 +75262,7 @@ ${content}` : content;
74174
75262
  return { success: true };
74175
75263
  }
74176
75264
  };
74177
- meta26 = {
75265
+ meta27 = {
74178
75266
  name: "evaluate",
74179
75267
  category: "evaluation",
74180
75268
  description: "A/B testing and quality evaluation framework",
@@ -74625,15 +75713,22 @@ async function registerBuiltInCommands() {
74625
75713
  initialize: async () => {
74626
75714
  }
74627
75715
  });
74628
- commandRegistry.register({
74629
- name: "upgrade",
74630
- category: "system",
74631
- description: "Upgrade MARIA",
74632
- aliases: [],
74633
- execute: async () => shield2({ message: "\u{1F512} Coming soon", showWaitlist: true }),
74634
- initialize: async () => {
74635
- }
74636
- });
75716
+ try {
75717
+ const { UpgradeCommand: UpgradeCommand2 } = await Promise.resolve().then(() => (init_upgrade_command(), upgrade_command_exports));
75718
+ const upgrade = new UpgradeCommand2();
75719
+ if (upgrade.initialize) await upgrade.initialize();
75720
+ commandRegistry.register(upgrade);
75721
+ } catch {
75722
+ commandRegistry.register({
75723
+ name: "upgrade",
75724
+ category: "system",
75725
+ description: "Upgrade your subscription plan",
75726
+ aliases: ["pro", "ultra", "premium", "subscribe"],
75727
+ execute: async () => shield2({ message: "\u{1F512} Coming soon", showWaitlist: true }),
75728
+ initialize: async () => {
75729
+ }
75730
+ });
75731
+ }
74637
75732
  } catch (error2) {
74638
75733
  console.error("Failed to register system _commands:", error2);
74639
75734
  }
@@ -77325,13 +78420,13 @@ ${options.map((opt, i2) => `${i2 + 1}) ${opt}`).join("\n")}`;
77325
78420
  const lines = response.split("\n");
77326
78421
  for (let i2 = 0; i2 < lines.length; i2++) {
77327
78422
  callback(lines[i2]);
77328
- let delay = 40;
78423
+ let delay2 = 40;
77329
78424
  const line = lines[i2];
77330
- if (line.trim().length === 0) delay = 20;
77331
- else if (line.includes("```")) delay = 60;
77332
- else if (/[.!?]$/.test(line)) delay = 80;
78425
+ if (line.trim().length === 0) delay2 = 20;
78426
+ else if (line.includes("```")) delay2 = 60;
78427
+ else if (/[.!?]$/.test(line)) delay2 = 80;
77333
78428
  if (i2 < lines.length - 1)
77334
- await new Promise((r2) => setTimeout(r2, delay));
78429
+ await new Promise((r2) => setTimeout(r2, delay2));
77335
78430
  }
77336
78431
  }
77337
78432
  };
@@ -78130,8 +79225,8 @@ async function runServerMode() {
78130
79225
  console.error(chalk14__default.default.white("Searched dirs: " + candidateDirs.join(" | ")));
78131
79226
  process.exit(1);
78132
79227
  }
78133
- const { spawn: spawn4 } = await import('child_process');
78134
- const serverProcess = spawn4("node", [serverPath], {
79228
+ const { spawn: spawn5 } = await import('child_process');
79229
+ const serverProcess = spawn5("node", [serverPath], {
78135
79230
  stdio: "inherit",
78136
79231
  env: process.env,
78137
79232
  cwd: path12__namespace.dirname(serverPath)