@massa-ai/opencode-plugin 1.57.0 → 1.58.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.
@@ -399,11 +399,85 @@ function configDir(app) {
399
399
  }
400
400
  var init_xdg = () => {};
401
401
 
402
+ // ../../packages/shared/dist/config/embedding-dimensions.js
403
+ var KNOWN_EMBEDDING_DIMENSIONS;
404
+ var init_embedding_dimensions = __esm(() => {
405
+ KNOWN_EMBEDDING_DIMENSIONS = {
406
+ "qwen3-embedding:8b": 4096,
407
+ "qwen3-embedding:4b": 2560,
408
+ "qwen3-embedding:0.6b": 1024,
409
+ "bge-m3": 1024
410
+ };
411
+ });
412
+
413
+ // ../../packages/shared/dist/config/inference-providers.js
414
+ function parseOllamaModelList(body) {
415
+ if (typeof body !== "object" || body === null)
416
+ return null;
417
+ const models = body.models;
418
+ if (!Array.isArray(models))
419
+ return null;
420
+ return models.map((entry) => entry.name).filter((name) => typeof name === "string");
421
+ }
422
+ function parseLmStudioModelList(body) {
423
+ if (typeof body !== "object" || body === null)
424
+ return null;
425
+ const data = body.data;
426
+ if (!Array.isArray(data))
427
+ return null;
428
+ return data.map((entry) => entry.id).filter((id) => typeof id === "string");
429
+ }
430
+ var LOCAL_INFERENCE_IDS, INFERENCE_PROVIDERS;
431
+ var init_inference_providers = __esm(() => {
432
+ init_embedding_dimensions();
433
+ LOCAL_INFERENCE_IDS = ["ollama", "lmstudio"];
434
+ INFERENCE_PROVIDERS = {
435
+ ollama: {
436
+ id: "ollama",
437
+ defaultEmbeddingBaseUrl: "http://localhost:11434",
438
+ defaultLlmBaseUrl: "http://localhost:11434/v1",
439
+ envNames: {
440
+ model: "OLLAMA_EMBEDDING_MODEL",
441
+ baseUrl: "OLLAMA_BASE_URL",
442
+ dimensions: "OLLAMA_EMBEDDING_DIMENSIONS"
443
+ },
444
+ knownDimensions: KNOWN_EMBEDDING_DIMENSIONS,
445
+ supportsOllamaVersionProbe: true,
446
+ injectsDisableThink: true,
447
+ requiresChatCompletionsApi: false,
448
+ parseModelList: parseOllamaModelList
449
+ },
450
+ lmstudio: {
451
+ id: "lmstudio",
452
+ defaultEmbeddingBaseUrl: "http://localhost:1234/v1",
453
+ defaultLlmBaseUrl: "http://localhost:1234/v1",
454
+ envNames: {
455
+ model: "LMSTUDIO_EMBEDDING_MODEL",
456
+ baseUrl: "LMSTUDIO_BASE_URL",
457
+ dimensions: "LMSTUDIO_EMBEDDING_DIMENSIONS"
458
+ },
459
+ knownDimensions: {
460
+ "text-embedding-nomic-embed-text-v1.5": 768
461
+ },
462
+ supportsOllamaVersionProbe: false,
463
+ injectsDisableThink: false,
464
+ requiresChatCompletionsApi: true,
465
+ parseModelList: parseLmStudioModelList
466
+ }
467
+ };
468
+ });
469
+
402
470
  // ../../packages/shared/dist/config/massa-ai-config.js
403
471
  import path2 from "path";
404
- var SCHEDULER_JOB_KINDS, MAX_MATCH_WORK = 1e5, MAX_IGNORE_PATTERNS = 1024, DEFAULT_CAPTURE_POLICY, DEFAULT_SCHEDULER_CONFIG, defaultMassaAiConfig;
472
+ var API_PROVIDER_IDS, EMBEDDING_PROVIDER_IDS, SCHEDULER_JOB_KINDS, MAX_MATCH_WORK = 1e5, MAX_IGNORE_PATTERNS = 1024, DEFAULT_CAPTURE_POLICY, DEFAULT_SCHEDULER_CONFIG, defaultMassaAiConfig;
405
473
  var init_massa_ai_config = __esm(() => {
406
474
  init_xdg();
475
+ init_inference_providers();
476
+ API_PROVIDER_IDS = ["mistral", "openai", "google", "cohere"];
477
+ EMBEDDING_PROVIDER_IDS = [
478
+ ...LOCAL_INFERENCE_IDS,
479
+ ...API_PROVIDER_IDS
480
+ ];
407
481
  SCHEDULER_JOB_KINDS = [
408
482
  "memory-consolidation",
409
483
  "decay-sweep",
@@ -672,11 +746,12 @@ function loadConfig() {
672
746
  try {
673
747
  const content = fs.readFileSync(CONFIG_FILE, "utf-8");
674
748
  const userConfig = JSON.parse(content);
749
+ const embeddingBase = userConfig.embedding?.provider && userConfig.embedding.provider !== defaultMassaAiConfig.embedding.provider ? {} : defaultMassaAiConfig.embedding;
675
750
  return {
676
751
  ...defaultMassaAiConfig,
677
752
  ...userConfig,
678
753
  database: { ...defaultMassaAiConfig.database, ...userConfig.database },
679
- embedding: { ...defaultMassaAiConfig.embedding, ...userConfig.embedding },
754
+ embedding: { ...embeddingBase, ...userConfig.embedding },
680
755
  compression: { ...defaultMassaAiConfig.compression, ...userConfig.compression },
681
756
  cache: { ...defaultMassaAiConfig.cache, ...userConfig.cache },
682
757
  logging: { ...defaultMassaAiConfig.logging, ...userConfig.logging },
@@ -821,18 +896,27 @@ function initConfig() {
821
896
  function getConfigForEnv() {
822
897
  const config = loadConfig();
823
898
  const env = {};
824
- if (config.embedding.provider === "ollama") {
899
+ const provider = config.embedding.provider;
900
+ if (provider === "ollama") {
825
901
  env.OLLAMA_EMBEDDING_MODEL = config.embedding.model;
826
902
  env.OLLAMA_BASE_URL = config.embedding.baseURL || "http://localhost:11434";
827
903
  if (config.embedding.dimensions) {
828
904
  env.OLLAMA_EMBEDDING_DIMENSIONS = String(config.embedding.dimensions);
829
905
  }
830
- } else if (config.embedding.provider === "mistral") {
906
+ } else if (provider === "lmstudio") {
907
+ env.LMSTUDIO_EMBEDDING_MODEL = config.embedding.model;
908
+ env.LMSTUDIO_BASE_URL = config.embedding.baseURL || INFERENCE_PROVIDERS.lmstudio.defaultEmbeddingBaseUrl;
909
+ if (config.embedding.dimensions) {
910
+ env.LMSTUDIO_EMBEDDING_DIMENSIONS = String(config.embedding.dimensions);
911
+ }
912
+ } else if (provider === "mistral") {
831
913
  env.MISTRAL_API_KEY = config.embedding.apiKey || "";
832
914
  env.MISTRAL_TEXT_EMBEDDING_MODEL = config.embedding.model;
833
- } else if (config.embedding.provider === "openai") {
915
+ } else if (provider === "openai") {
834
916
  env.OPENAI_API_KEY = config.embedding.apiKey || "";
835
917
  env.OPENAI_EMBEDDING_MODEL = config.embedding.model;
918
+ } else {
919
+ console.error(`[getConfigForEnv] embedding.provider "${provider}" has no env-projection branch \u2014 no embedding env vars were set`);
836
920
  }
837
921
  env.LOG_LEVEL = config.logging.level;
838
922
  env.ENABLE_METRICS = String(config.logging.enableMetrics);
@@ -842,6 +926,7 @@ var CONFIG_DIR, CONFIG_FILE, ConfigParseError, ConfigWriteConflictError, migrati
842
926
  var init_config_loader = __esm(() => {
843
927
  init_massa_ai_config();
844
928
  init_xdg();
929
+ init_inference_providers();
845
930
  CONFIG_DIR = configDir("massa-ai");
846
931
  CONFIG_FILE = path3.join(CONFIG_DIR, "config.json");
847
932
  ConfigParseError = class ConfigParseError extends Error {
@@ -917,6 +1002,7 @@ init_xdg();
917
1002
  init_config_loader();
918
1003
 
919
1004
  // ../../packages/shared/dist/config/index.js
1005
+ init_embedding_dimensions();
920
1006
  var DEFAULT_LLM_MODEL = "qwen2.5:7b-instruct";
921
1007
  var DEFAULT_LLM_CODE_MODEL = "qwen2.5-coder:7b";
922
1008
  function envNum(key, fallback) {
@@ -3275,11 +3361,13 @@ function formatBootstrapReport(report) {
3275
3361
  // ../../packages/shared/dist/bootstrap/index.js
3276
3362
  init_config_loader();
3277
3363
  // src/config-cli.ts
3364
+ init_inference_providers();
3278
3365
  import { promises as fs11 } from "fs";
3279
3366
  import path15 from "path";
3280
3367
  import os8 from "os";
3281
3368
  import { fileURLToPath } from "url";
3282
3369
  var __dirname2 = path15.dirname(fileURLToPath(import.meta.url));
3370
+ var WRITABLE_PROVIDERS = ["ollama", "lmstudio", "mistral", "openai", "google", "cohere"];
3283
3371
  var GENERATOR_MARKER = "scripts/generate-subagent-artifacts.ts";
3284
3372
  var GENERATOR_MARKER_MAX_LEVELS = 6;
3285
3373
  function formatVariantSync(results) {
@@ -3299,16 +3387,18 @@ Usage:
3299
3387
  Commands:
3300
3388
  init Initialize massa-ai configuration
3301
3389
  --ollama Use Ollama (local, default)
3390
+ --lmstudio Use LM Studio (local)
3302
3391
  --mistral <key> Use Mistral with API key
3303
3392
  --openai <key> Use OpenAI with API key
3304
3393
 
3305
3394
  path Show config file path
3306
3395
  show Show current configuration
3307
3396
  set <key> <val> Set a configuration value
3308
- use <provider> Switch embedding provider
3309
- --api-key <key> API key (required for mistral/openai)
3397
+ use <provider> Switch embedding provider (ollama, lmstudio, mistral,
3398
+ openai, google, cohere)
3399
+ --api-key <key> API key (required for mistral/openai/google/cohere)
3310
3400
  --model <name> Model name
3311
- --base-url <url> Base URL (for ollama)
3401
+ --base-url <url> Base URL (for ollama/lmstudio)
3312
3402
 
3313
3403
  agents Manage the 18 subagent specialist definitions
3314
3404
  agents install [--user|--project] Write 18 agent .md files
@@ -3328,8 +3418,10 @@ Commands:
3328
3418
 
3329
3419
  Examples:
3330
3420
  massa-ai-config init
3421
+ massa-ai-config init --lmstudio
3331
3422
  massa-ai-config init --mistral your-api-key
3332
3423
  massa-ai-config use ollama --model qwen3-embedding:4b
3424
+ massa-ai-config use lmstudio
3333
3425
  massa-ai-config use mistral --api-key your-key
3334
3426
  massa-ai-config set embedding.dimensions 1024
3335
3427
  massa-ai-config agents install --user
@@ -3408,6 +3500,18 @@ async function runCli(argv) {
3408
3500
  };
3409
3501
  saveConfig(config2);
3410
3502
  console.log("\u2713 Configured for OpenAI embeddings");
3503
+ } else if (options.lmstudio) {
3504
+ const config2 = loadConfig();
3505
+ const model = "text-embedding-nomic-embed-text-v1.5";
3506
+ config2.embedding = {
3507
+ provider: "lmstudio",
3508
+ model,
3509
+ baseURL: INFERENCE_PROVIDERS.lmstudio.defaultEmbeddingBaseUrl,
3510
+ dimensions: INFERENCE_PROVIDERS.lmstudio.knownDimensions[model] ?? 768
3511
+ };
3512
+ config2.llm.baseUrl = INFERENCE_PROVIDERS.lmstudio.defaultLlmBaseUrl;
3513
+ saveConfig(config2);
3514
+ console.log("\u2713 Configured for LM Studio (local) embeddings");
3411
3515
  } else {
3412
3516
  console.log("\u2713 Configured for Ollama (local) embeddings");
3413
3517
  }
@@ -3452,8 +3556,8 @@ Using defaults:`);
3452
3556
  }
3453
3557
  case "use": {
3454
3558
  const provider = args[1];
3455
- if (!provider || !["ollama", "mistral", "openai"].includes(provider)) {
3456
- console.error("Provider must be: ollama, mistral, or openai");
3559
+ if (!provider || !WRITABLE_PROVIDERS.includes(provider)) {
3560
+ console.error(`Provider must be one of: ${WRITABLE_PROVIDERS.join(", ")}`);
3457
3561
  return 1;
3458
3562
  }
3459
3563
  const config2 = loadConfig();
@@ -3464,6 +3568,15 @@ Using defaults:`);
3464
3568
  baseURL: options["base-url"] || "http://localhost:11434",
3465
3569
  dimensions: 2560
3466
3570
  };
3571
+ } else if (provider === "lmstudio") {
3572
+ const model = options.model || "text-embedding-nomic-embed-text-v1.5";
3573
+ config2.embedding = {
3574
+ provider: "lmstudio",
3575
+ model,
3576
+ baseURL: options["base-url"] || INFERENCE_PROVIDERS.lmstudio.defaultEmbeddingBaseUrl,
3577
+ dimensions: INFERENCE_PROVIDERS.lmstudio.knownDimensions[model] ?? 768
3578
+ };
3579
+ config2.llm.baseUrl = options["base-url"] || INFERENCE_PROVIDERS.lmstudio.defaultLlmBaseUrl;
3467
3580
  } else if (provider === "mistral") {
3468
3581
  if (!options["api-key"]) {
3469
3582
  console.error("Error: --api-key required for Mistral");
@@ -3486,6 +3599,28 @@ Using defaults:`);
3486
3599
  apiKey: options["api-key"],
3487
3600
  dimensions: 1536
3488
3601
  };
3602
+ } else if (provider === "google") {
3603
+ if (!options["api-key"]) {
3604
+ console.error("Error: --api-key required for Google");
3605
+ return 1;
3606
+ }
3607
+ config2.embedding = {
3608
+ provider: "google",
3609
+ model: options.model || "gemini-embedding-001",
3610
+ apiKey: options["api-key"],
3611
+ dimensions: 3072
3612
+ };
3613
+ } else if (provider === "cohere") {
3614
+ if (!options["api-key"]) {
3615
+ console.error("Error: --api-key required for Cohere");
3616
+ return 1;
3617
+ }
3618
+ config2.embedding = {
3619
+ provider: "cohere",
3620
+ model: options.model || "embed-english-v3.0",
3621
+ apiKey: options["api-key"],
3622
+ dimensions: 1024
3623
+ };
3489
3624
  }
3490
3625
  saveConfig(config2);
3491
3626
  console.log(`\u2713 Switched to ${provider} embeddings`);
package/dist/index.js CHANGED
@@ -398,11 +398,85 @@ function configDir(app) {
398
398
  }
399
399
  var init_xdg = () => {};
400
400
 
401
+ // ../../packages/shared/dist/config/embedding-dimensions.js
402
+ var KNOWN_EMBEDDING_DIMENSIONS;
403
+ var init_embedding_dimensions = __esm(() => {
404
+ KNOWN_EMBEDDING_DIMENSIONS = {
405
+ "qwen3-embedding:8b": 4096,
406
+ "qwen3-embedding:4b": 2560,
407
+ "qwen3-embedding:0.6b": 1024,
408
+ "bge-m3": 1024
409
+ };
410
+ });
411
+
412
+ // ../../packages/shared/dist/config/inference-providers.js
413
+ function parseOllamaModelList(body) {
414
+ if (typeof body !== "object" || body === null)
415
+ return null;
416
+ const models = body.models;
417
+ if (!Array.isArray(models))
418
+ return null;
419
+ return models.map((entry) => entry.name).filter((name) => typeof name === "string");
420
+ }
421
+ function parseLmStudioModelList(body) {
422
+ if (typeof body !== "object" || body === null)
423
+ return null;
424
+ const data = body.data;
425
+ if (!Array.isArray(data))
426
+ return null;
427
+ return data.map((entry) => entry.id).filter((id) => typeof id === "string");
428
+ }
429
+ var LOCAL_INFERENCE_IDS, INFERENCE_PROVIDERS;
430
+ var init_inference_providers = __esm(() => {
431
+ init_embedding_dimensions();
432
+ LOCAL_INFERENCE_IDS = ["ollama", "lmstudio"];
433
+ INFERENCE_PROVIDERS = {
434
+ ollama: {
435
+ id: "ollama",
436
+ defaultEmbeddingBaseUrl: "http://localhost:11434",
437
+ defaultLlmBaseUrl: "http://localhost:11434/v1",
438
+ envNames: {
439
+ model: "OLLAMA_EMBEDDING_MODEL",
440
+ baseUrl: "OLLAMA_BASE_URL",
441
+ dimensions: "OLLAMA_EMBEDDING_DIMENSIONS"
442
+ },
443
+ knownDimensions: KNOWN_EMBEDDING_DIMENSIONS,
444
+ supportsOllamaVersionProbe: true,
445
+ injectsDisableThink: true,
446
+ requiresChatCompletionsApi: false,
447
+ parseModelList: parseOllamaModelList
448
+ },
449
+ lmstudio: {
450
+ id: "lmstudio",
451
+ defaultEmbeddingBaseUrl: "http://localhost:1234/v1",
452
+ defaultLlmBaseUrl: "http://localhost:1234/v1",
453
+ envNames: {
454
+ model: "LMSTUDIO_EMBEDDING_MODEL",
455
+ baseUrl: "LMSTUDIO_BASE_URL",
456
+ dimensions: "LMSTUDIO_EMBEDDING_DIMENSIONS"
457
+ },
458
+ knownDimensions: {
459
+ "text-embedding-nomic-embed-text-v1.5": 768
460
+ },
461
+ supportsOllamaVersionProbe: false,
462
+ injectsDisableThink: false,
463
+ requiresChatCompletionsApi: true,
464
+ parseModelList: parseLmStudioModelList
465
+ }
466
+ };
467
+ });
468
+
401
469
  // ../../packages/shared/dist/config/massa-ai-config.js
402
470
  import path2 from "path";
403
- var SCHEDULER_JOB_KINDS, MAX_MATCH_WORK = 1e5, MAX_IGNORE_PATTERNS = 1024, DEFAULT_CAPTURE_POLICY, DEFAULT_SCHEDULER_CONFIG, defaultMassaAiConfig;
471
+ var API_PROVIDER_IDS, EMBEDDING_PROVIDER_IDS, SCHEDULER_JOB_KINDS, MAX_MATCH_WORK = 1e5, MAX_IGNORE_PATTERNS = 1024, DEFAULT_CAPTURE_POLICY, DEFAULT_SCHEDULER_CONFIG, defaultMassaAiConfig;
404
472
  var init_massa_ai_config = __esm(() => {
405
473
  init_xdg();
474
+ init_inference_providers();
475
+ API_PROVIDER_IDS = ["mistral", "openai", "google", "cohere"];
476
+ EMBEDDING_PROVIDER_IDS = [
477
+ ...LOCAL_INFERENCE_IDS,
478
+ ...API_PROVIDER_IDS
479
+ ];
406
480
  SCHEDULER_JOB_KINDS = [
407
481
  "memory-consolidation",
408
482
  "decay-sweep",
@@ -671,11 +745,12 @@ function loadConfig() {
671
745
  try {
672
746
  const content = fs.readFileSync(CONFIG_FILE, "utf-8");
673
747
  const userConfig = JSON.parse(content);
748
+ const embeddingBase = userConfig.embedding?.provider && userConfig.embedding.provider !== defaultMassaAiConfig.embedding.provider ? {} : defaultMassaAiConfig.embedding;
674
749
  return {
675
750
  ...defaultMassaAiConfig,
676
751
  ...userConfig,
677
752
  database: { ...defaultMassaAiConfig.database, ...userConfig.database },
678
- embedding: { ...defaultMassaAiConfig.embedding, ...userConfig.embedding },
753
+ embedding: { ...embeddingBase, ...userConfig.embedding },
679
754
  compression: { ...defaultMassaAiConfig.compression, ...userConfig.compression },
680
755
  cache: { ...defaultMassaAiConfig.cache, ...userConfig.cache },
681
756
  logging: { ...defaultMassaAiConfig.logging, ...userConfig.logging },
@@ -820,18 +895,27 @@ function initConfig() {
820
895
  function getConfigForEnv() {
821
896
  const config = loadConfig();
822
897
  const env = {};
823
- if (config.embedding.provider === "ollama") {
898
+ const provider = config.embedding.provider;
899
+ if (provider === "ollama") {
824
900
  env.OLLAMA_EMBEDDING_MODEL = config.embedding.model;
825
901
  env.OLLAMA_BASE_URL = config.embedding.baseURL || "http://localhost:11434";
826
902
  if (config.embedding.dimensions) {
827
903
  env.OLLAMA_EMBEDDING_DIMENSIONS = String(config.embedding.dimensions);
828
904
  }
829
- } else if (config.embedding.provider === "mistral") {
905
+ } else if (provider === "lmstudio") {
906
+ env.LMSTUDIO_EMBEDDING_MODEL = config.embedding.model;
907
+ env.LMSTUDIO_BASE_URL = config.embedding.baseURL || INFERENCE_PROVIDERS.lmstudio.defaultEmbeddingBaseUrl;
908
+ if (config.embedding.dimensions) {
909
+ env.LMSTUDIO_EMBEDDING_DIMENSIONS = String(config.embedding.dimensions);
910
+ }
911
+ } else if (provider === "mistral") {
830
912
  env.MISTRAL_API_KEY = config.embedding.apiKey || "";
831
913
  env.MISTRAL_TEXT_EMBEDDING_MODEL = config.embedding.model;
832
- } else if (config.embedding.provider === "openai") {
914
+ } else if (provider === "openai") {
833
915
  env.OPENAI_API_KEY = config.embedding.apiKey || "";
834
916
  env.OPENAI_EMBEDDING_MODEL = config.embedding.model;
917
+ } else {
918
+ console.error(`[getConfigForEnv] embedding.provider "${provider}" has no env-projection branch \u2014 no embedding env vars were set`);
835
919
  }
836
920
  env.LOG_LEVEL = config.logging.level;
837
921
  env.ENABLE_METRICS = String(config.logging.enableMetrics);
@@ -841,6 +925,7 @@ var CONFIG_DIR, CONFIG_FILE, ConfigParseError, ConfigWriteConflictError, migrati
841
925
  var init_config_loader = __esm(() => {
842
926
  init_massa_ai_config();
843
927
  init_xdg();
928
+ init_inference_providers();
844
929
  CONFIG_DIR = configDir("massa-ai");
845
930
  CONFIG_FILE = path3.join(CONFIG_DIR, "config.json");
846
931
  ConfigParseError = class ConfigParseError extends Error {
@@ -916,6 +1001,7 @@ init_xdg();
916
1001
  init_config_loader();
917
1002
 
918
1003
  // ../../packages/shared/dist/config/index.js
1004
+ init_embedding_dimensions();
919
1005
  var DEFAULT_LLM_MODEL = "qwen2.5:7b-instruct";
920
1006
  var DEFAULT_LLM_CODE_MODEL = "qwen2.5-coder:7b";
921
1007
  function envNum(key, fallback) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massa-ai/opencode-plugin",
3
- "version": "1.57.0",
3
+ "version": "1.58.0",
4
4
  "description": "massa-ai plugin for OpenCode - Semantic code search, memory, and context compression",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,8 +24,8 @@
24
24
  "dependencies": {
25
25
  "@opencode-ai/plugin": "^1.2.15",
26
26
  "@opencode-ai/sdk": "^1.2.15",
27
- "@massa-ai/core": "^1.57.0",
28
- "@massa-ai/shared": "^1.57.0"
27
+ "@massa-ai/core": "^1.58.0",
28
+ "@massa-ai/shared": "^1.58.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.10.5",