easc-cli 1.1.34 → 1.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
- "version": "1.1.34",
3
+ "version": "1.1.37",
4
4
  "name": "easc-cli",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,13 +23,106 @@
23
23
  "exports": {
24
24
  "./*": "./src/*.ts"
25
25
  },
26
- "devDependencies": {},
27
- "dependencies": {},
26
+ "devDependencies": {
27
+ "@babel/core": "7.28.4",
28
+ "@octokit/webhooks-types": "7.6.1",
29
+ "@eliseart.ai/script": "workspace:*",
30
+ "@parcel/watcher-darwin-arm64": "2.5.1",
31
+ "@parcel/watcher-darwin-x64": "2.5.1",
32
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
33
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
34
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
35
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
36
+ "@parcel/watcher-win32-x64": "2.5.1",
37
+ "@standard-schema/spec": "1.0.0",
38
+ "@tsconfig/bun": "catalog:",
39
+ "@types/babel__core": "7.20.5",
40
+ "@types/bun": "catalog:",
41
+ "@types/turndown": "5.0.5",
42
+ "@types/yargs": "17.0.33",
43
+ "@typescript/native-preview": "catalog:",
44
+ "typescript": "catalog:",
45
+ "vscode-languageserver-types": "3.17.5",
46
+ "why-is-node-running": "3.2.2",
47
+ "zod-to-json-schema": "3.24.5"
48
+ },
49
+ "dependencies": {
50
+ "@actions/core": "1.11.1",
51
+ "@actions/github": "6.0.1",
52
+ "@agentclientprotocol/sdk": "0.5.1",
53
+ "@ai-sdk/amazon-bedrock": "3.0.73",
54
+ "@ai-sdk/anthropic": "2.0.57",
55
+ "@ai-sdk/azure": "2.0.91",
56
+ "@ai-sdk/cerebras": "1.0.34",
57
+ "@ai-sdk/cohere": "2.0.22",
58
+ "@ai-sdk/deepinfra": "1.0.31",
59
+ "@ai-sdk/gateway": "2.0.25",
60
+ "@ai-sdk/google": "2.0.52",
61
+ "@ai-sdk/google-vertex": "3.0.97",
62
+ "@ai-sdk/groq": "2.0.34",
63
+ "@ai-sdk/mistral": "2.0.27",
64
+ "@ai-sdk/openai": "2.0.89",
65
+ "@ai-sdk/openai-compatible": "1.0.30",
66
+ "@ai-sdk/perplexity": "2.0.23",
67
+ "@ai-sdk/provider": "2.0.1",
68
+ "@ai-sdk/provider-utils": "3.0.20",
69
+ "@ai-sdk/togetherai": "1.0.31",
70
+ "@ai-sdk/vercel": "1.0.31",
71
+ "@ai-sdk/xai": "2.0.51",
72
+ "@clack/prompts": "1.0.0-alpha.1",
73
+ "@eliseart.ai/plugin": "workspace:*",
74
+ "@eliseart.ai/sdk": "workspace:*",
75
+ "@eliseart.ai/util": "workspace:*",
76
+ "@gitlab/gitlab-ai-provider": "3.1.2",
77
+ "@hono/standard-validator": "0.1.5",
78
+ "@hono/zod-validator": "catalog:",
79
+ "@modelcontextprotocol/sdk": "1.25.2",
80
+ "@octokit/graphql": "9.0.2",
81
+ "@octokit/rest": "catalog:",
82
+ "@openauthjs/openauth": "catalog:",
83
+ "@openrouter/ai-sdk-provider": "1.5.2",
84
+ "@opentui/core": "0.1.74",
85
+ "@opentui/solid": "0.1.74",
86
+ "@parcel/watcher": "2.5.1",
87
+ "@pierre/diffs": "catalog:",
88
+ "@solid-primitives/event-bus": "1.1.2",
89
+ "@solid-primitives/scheduled": "1.5.2",
90
+ "@zip.js/zip.js": "2.7.62",
91
+ "ai": "catalog:",
92
+ "bonjour-service": "1.3.0",
93
+ "bun-pty": "0.4.4",
94
+ "chokidar": "4.0.3",
95
+ "clipboardy": "4.0.0",
96
+ "decimal.js": "10.5.0",
97
+ "diff": "catalog:",
98
+ "fuzzysort": "3.1.0",
99
+ "gray-matter": "4.0.3",
100
+ "hono": "catalog:",
101
+ "hono-openapi": "catalog:",
102
+ "ignore": "7.0.5",
103
+ "jsonc-parser": "3.3.1",
104
+ "minimatch": "10.0.3",
105
+ "open": "10.1.2",
106
+ "opentui-spinner": "0.0.6",
107
+ "partial-json": "0.1.7",
108
+ "remeda": "catalog:",
109
+ "solid-js": "catalog:",
110
+ "strip-ansi": "7.1.2",
111
+ "tree-sitter-bash": "0.25.0",
112
+ "turndown": "7.2.0",
113
+ "ulid": "catalog:",
114
+ "vscode-jsonrpc": "8.2.1",
115
+ "web-tree-sitter": "0.25.10",
116
+ "xdg-basedir": "5.1.0",
117
+ "yargs": "18.0.0",
118
+ "zod": "catalog:",
119
+ "zod-to-json-schema": "3.24.5"
120
+ },
28
121
  "optionalDependencies": {
29
- "easc-linux-x64": "0.0.0-main-202601241225",
30
- "easc-linux-arm64": "0.0.0-main-202601241225",
31
- "easc-darwin-x64": "0.0.0-main-202601241225",
32
- "easc-darwin-arm64": "0.0.0-main-202601241225",
33
- "easc-windows-x64": "0.0.0-main-202601241225"
122
+ "easc-linux-x64": "0.0.0-main-202601241243",
123
+ "easc-linux-arm64": "0.0.0-main-202601241243",
124
+ "easc-darwin-x64": "0.0.0-main-202601241243",
125
+ "easc-darwin-arm64": "0.0.0-main-202601241243",
126
+ "easc-windows-x64": "0.0.0-main-202601241243"
34
127
  }
35
128
  }
package/script/deploy.ts CHANGED
@@ -43,7 +43,7 @@ for (const pkgName of packages) {
43
43
  try {
44
44
  await $`cd ${pkgDir} && npm publish --access public`
45
45
  console.log(` ✅ Published ${pkgJson.name}`)
46
- } catch (e) {
46
+ } catch (e: any) {
47
47
  console.error(` ❌ Failed to publish ${pkgJson.name}:`, e.message)
48
48
  // We continue even if one fails, as duplicates might exist
49
49
  }
@@ -56,6 +56,7 @@ const binaryVersion = linuxPkg.version
56
56
 
57
57
  const mainPkgPath = path.join(root, "package.json")
58
58
  const mainPkg = JSON.parse(fs.readFileSync(mainPkgPath, "utf-8"))
59
+ const originalMainPkg = JSON.parse(fs.readFileSync(mainPkgPath, "utf-8")) // keep original
59
60
 
60
61
  const platforms = [
61
62
  "easc-linux-x64", "easc-linux-arm64",
@@ -67,9 +68,6 @@ for (const p of platforms) {
67
68
  mainPkg.optionalDependencies[p] = binaryVersion
68
69
  }
69
70
 
70
- fs.writeFileSync(mainPkgPath, JSON.stringify(mainPkg, null, 2))
71
- console.log(` Updated optionalDependencies to ${binaryVersion}`)
72
-
73
71
  // 4. Publish the main wrapper package
74
72
  console.log(`\n📤 Publishing main wrapper package (easc-cli@${pkg.version})...`)
75
73
 
@@ -83,10 +81,16 @@ try {
83
81
  // Ensure we are in the root of the package
84
82
  await $`npm publish --access public`
85
83
  console.log(`✅ Published ${pkg.name}`)
86
- } catch (e) {
84
+ } catch (e: any) {
87
85
  console.error(`❌ Failed to publish ${pkg.name}:`, e.message)
86
+ // Restore original package.json
87
+ fs.writeFileSync(mainPkgPath, JSON.stringify(originalMainPkg, null, 2))
88
88
  process.exit(1)
89
89
  }
90
90
 
91
+ // Restore original package.json with deps intact (but keep updated optionalDeps)
92
+ originalMainPkg.optionalDependencies = mainPkg.optionalDependencies
93
+ fs.writeFileSync(mainPkgPath, JSON.stringify(originalMainPkg, null, 2))
94
+
91
95
  console.log("\n✨ Deployment complete! Users can now install with:")
92
- console.log(" npm install -g easc")
96
+ console.log(" npm install -g easc-cli")
@@ -211,11 +211,11 @@ export namespace Config {
211
211
  {
212
212
  cwd: dir,
213
213
  },
214
- ).catch(() => {})
214
+ ).catch(() => { })
215
215
 
216
216
  // Install any additional dependencies defined in the package.json
217
217
  // This allows local plugins and custom tools to use external packages
218
- await BunProc.run(["install"], { cwd: dir }).catch(() => {})
218
+ await BunProc.run(["install"], { cwd: dir }).catch(() => { })
219
219
  }
220
220
 
221
221
  function rel(item: string, patterns: string[]) {
@@ -1098,7 +1098,7 @@ export namespace Config {
1098
1098
  mergeDeep(await loadFile(path.join(Global.Path.config, "opencode.jsonc"))),
1099
1099
  )
1100
1100
 
1101
- await import(path.join(Global.Path.config, "config"), {
1101
+ await import(pathToFileURL(path.join(Global.Path.config, "config")).href, {
1102
1102
  with: {
1103
1103
  type: "toml",
1104
1104
  },
@@ -1111,7 +1111,7 @@ export namespace Config {
1111
1111
  await Bun.write(path.join(Global.Path.config, "config.json"), JSON.stringify(result, null, 2))
1112
1112
  await fs.unlink(path.join(Global.Path.config, "config"))
1113
1113
  })
1114
- .catch(() => {})
1114
+ .catch(() => { })
1115
1115
 
1116
1116
  return result
1117
1117
  })
@@ -1201,7 +1201,7 @@ export namespace Config {
1201
1201
  parsed.data.$schema = "https://eliseart.ai/config.json"
1202
1202
  // Write the $schema to the original text to preserve variables like {env:VAR}
1203
1203
  const updated = original.replace(/^\s*\{/, '{\n "$schema": "https://eliseart.ai/config.json",')
1204
- await Bun.write(configFilepath, updated).catch(() => {})
1204
+ await Bun.write(configFilepath, updated).catch(() => { })
1205
1205
  }
1206
1206
  const data = parsed.data
1207
1207
  if (data.plugin) {
@@ -1209,7 +1209,7 @@ export namespace Config {
1209
1209
  const plugin = data.plugin[i]
1210
1210
  try {
1211
1211
  data.plugin[i] = import.meta.resolve!(plugin, configFilepath)
1212
- } catch (err) {}
1212
+ } catch (err) { }
1213
1213
  }
1214
1214
  }
1215
1215
  return data
@@ -11,6 +11,7 @@ import { CodexAuthPlugin } from "./codex"
11
11
  import { Session } from "../session"
12
12
  import { NamedError } from "@eliseart.ai/util/error"
13
13
  import { CopilotAuthPlugin } from "./copilot"
14
+ import { pathToFileURL } from "url"
14
15
 
15
16
  export namespace Plugin {
16
17
  const log = Log.create({ service: "plugin" })
@@ -44,7 +45,7 @@ export namespace Plugin {
44
45
  }
45
46
 
46
47
  const plugins = [...(config.plugin ?? [])]
47
- if (!Flag.OPENCODE_DISABLE_DEFAULT_PLUGINS) {
48
+ if (!Flag.EASC_DISABLE_DEFAULT_PLUGINS) {
48
49
  plugins.push(...BUILTIN)
49
50
  }
50
51
 
@@ -76,7 +77,7 @@ export namespace Plugin {
76
77
  })
77
78
  if (!plugin) continue
78
79
  }
79
- const mod = await import(plugin)
80
+ const mod = await import(pathToFileURL(plugin).href)
80
81
  // Prevent duplicate initialization when plugins export the same function
81
82
  // as both a named export and default export (e.g., `export const X` and `export default X`).
82
83
  // Object.entries(mod) would return both entries pointing to the same function reference.
@@ -1,4 +1,5 @@
1
1
  import z from "zod"
2
+ import { pathToFileURL } from "url"
2
3
  import fuzzysort from "fuzzysort"
3
4
  import { Config } from "../config/config"
4
5
  import { mapValues, mergeDeep, omit, pickBy, sortBy } from "remeda"
@@ -263,7 +264,7 @@ export namespace Provider {
263
264
  // Only use credential chain if no bearer token exists
264
265
  // Bearer token takes precedence over credential chain (profiles, access keys, IAM roles, web identity tokens)
265
266
  if (!awsBearerToken) {
266
- const { fromNodeProviderChain } = await import(await BunProc.install("@aws-sdk/credential-providers"))
267
+ const { fromNodeProviderChain } = await import(pathToFileURL(await BunProc.install("@aws-sdk/credential-providers")).href)
267
268
 
268
269
  // Build credential provider options (only pass profile if specified)
269
270
  const credentialProviderOptions = profile ? { profile } : {}
@@ -524,6 +525,16 @@ export namespace Provider {
524
525
  // Strip Authorization header - AI Gateway uses cf-aig-authorization instead
525
526
  headers.delete("Authorization")
526
527
 
528
+ /*
529
+ console.log(`\x1b[36m│\x1b[0m Plan: ${plan.toUpperCase().padEnd(22)} \x1b[36m│\x1b[0m`)
530
+ const formattedBalance = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(aiCredits)
531
+ console.log(`\x1b[36m│\x1b[0m AI Balance: ${formattedBalance.padEnd(22)} \x1b[36m│\x1b[0m`)
532
+ if (planExpiresAt) {
533
+ const expires = new Date(planExpiresAt).toLocaleDateString()
534
+ console.log(`\x1b[36m│\x1b[0m Renews: ${expires.padEnd(22)} \x1b[36m│\x1b[0m`)
535
+ }
536
+ */
537
+
527
538
  // Transform max_tokens to max_completion_tokens for newer models
528
539
  if (init?.body && init.method === "POST") {
529
540
  try {
@@ -764,83 +775,116 @@ export namespace Provider {
764
775
  env: [],
765
776
  options: {},
766
777
  models: {
767
- // Free models
778
+ // Free tier models (low cost)
768
779
  "meta-llama/llama-3.2-3b-instruct:free": eliseartBaseModel(
769
780
  "meta-llama/llama-3.2-3b-instruct:free",
770
- "Llama 3.2 3B (Free)"
781
+ "Llama 3.2 3B (Free)",
782
+ { cost: { input: 0.015, output: 0.06, cache: { read: 0, write: 0 } } }
771
783
  ),
772
784
  "google/gemini-2.0-flash-exp:free": eliseartBaseModel(
773
785
  "google/gemini-2.0-flash-exp:free",
774
786
  "Gemini 2.0 Flash (Free)",
775
- { capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
787
+ {
788
+ cost: { input: 0.135, output: 0.54, cache: { read: 0, write: 0 } },
789
+ capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false }
790
+ }
776
791
  ),
777
792
  "cognitivecomputations/dolphin-mistral-24b-venice-edition:free": eliseartBaseModel(
778
793
  "cognitivecomputations/dolphin-mistral-24b-venice-edition:free",
779
- "Dolphin Mistral 24B (Free)"
794
+ "Dolphin Mistral 24B (Free)",
795
+ { cost: { input: 0.10, output: 0.40, cache: { read: 0, write: 0 } } }
780
796
  ),
781
797
  "z-ai/glm-4.5-air:free": eliseartBaseModel(
782
798
  "z-ai/glm-4.5-air:free",
783
- "GLM 4.5 Air (Free)"
799
+ "GLM 4.5 Air (Free)",
800
+ { cost: { input: 0.25, output: 1.50, cache: { read: 0, write: 0 } } }
784
801
  ),
785
- "deepseek/deepseek-r1-0528:free": eliseartBaseModel(
786
- "deepseek/deepseek-r1-0528:free",
787
- "DeepSeek R1 (Free)",
788
- { capabilities: { temperature: true, reasoning: true, attachment: false, toolcall: true, input: { text: true, audio: false, image: false, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
802
+ "deepseek/deepseek-chat:free": eliseartBaseModel(
803
+ "deepseek/deepseek-chat:free",
804
+ "DeepSeek Chat (Free)",
805
+ { cost: { input: 0.54, output: 1.53, cache: { read: 0, write: 0 } } }
789
806
  ),
790
- "mistralai/devstral-2512:free": eliseartBaseModel(
791
- "mistralai/devstral-2512:free",
792
- "Devstral 2512 (Free)"
807
+ "mistralai/mistral-7b-instruct:free": eliseartBaseModel(
808
+ "mistralai/mistral-7b-instruct:free",
809
+ "Mistral 7B (Free)",
810
+ { cost: { input: 0.025, output: 0.10, cache: { read: 0, write: 0 } } }
793
811
  ),
794
- // Premium models
795
- "google/gemini-2.0-flash-exp": eliseartBaseModel(
796
- "google/gemini-2.0-flash-exp",
797
- "Gemini 2.0 Flash",
798
- { capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
812
+ "google/gemma-2-9b-it:free": eliseartBaseModel(
813
+ "google/gemma-2-9b-it:free",
814
+ "Gemma 2 9B (Free)",
815
+ { cost: { input: 0.025, output: 0.10, cache: { read: 0, write: 0 } } }
799
816
  ),
800
- "google/gemini-1.5-pro": eliseartBaseModel(
801
- "google/gemini-1.5-pro",
802
- "Gemini 1.5 Pro",
803
- { limit: { context: 1000000, output: 8192 }, capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: true, pdf: true }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
817
+ "gryphe/mythomax-l2-13b:free": eliseartBaseModel(
818
+ "gryphe/mythomax-l2-13b:free",
819
+ "MythoMax 13B (Free)",
820
+ { cost: { input: 0.05, output: 0.20, cache: { read: 0, write: 0 } } }
804
821
  ),
805
- "anthropic/claude-3.5-sonnet": eliseartBaseModel(
806
- "anthropic/claude-3.5-sonnet",
807
- "Claude 3.5 Sonnet",
808
- { limit: { context: 200000, output: 8192 }, capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
822
+ "qwen/qwen-2.5-coder-32b-instruct:free": eliseartBaseModel(
823
+ "qwen/qwen-2.5-coder-32b-instruct:free",
824
+ "Qwen 2.5 Coder 32B (Free)",
825
+ { cost: { input: 0.165, output: 1.35, cache: { read: 0, write: 0 } } }
809
826
  ),
810
- "anthropic/claude-3-opus": eliseartBaseModel(
811
- "anthropic/claude-3-opus",
812
- "Claude 3 Opus",
813
- { limit: { context: 200000, output: 4096 }, capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
827
+ "mistralai/pixtral-large-2411:free": eliseartBaseModel(
828
+ "mistralai/pixtral-large-2411:free",
829
+ "Pixtral Large (Free)",
830
+ {
831
+ cost: { input: 0.20, output: 1.20, cache: { read: 0, write: 0 } },
832
+ capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false }
833
+ }
814
834
  ),
815
- "openai/gpt-4o": eliseartBaseModel(
816
- "openai/gpt-4o",
817
- "GPT-4o",
818
- { limit: { context: 128000, output: 16384 }, capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
835
+ "mistralai/codestral-2501:free": eliseartBaseModel(
836
+ "mistralai/codestral-2501:free",
837
+ "Codestral (Free)",
838
+ { cost: { input: 0.30, output: 0.90, cache: { read: 0, write: 0 } } }
819
839
  ),
820
- "openai/gpt-4-turbo": eliseartBaseModel(
821
- "openai/gpt-4-turbo",
822
- "GPT-4 Turbo",
823
- { limit: { context: 128000, output: 4096 }, capabilities: { temperature: true, reasoning: false, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false } }
840
+ "meta-llama/llama-3.3-70b-instruct:free": eliseartBaseModel(
841
+ "meta-llama/llama-3.3-70b-instruct:free",
842
+ "Llama 3.3 70B (Free)",
843
+ { cost: { input: 0.50, output: 2.00, cache: { read: 0, write: 0 } } }
824
844
  ),
825
- "meta-llama/llama-3.1-70b-instruct": eliseartBaseModel(
826
- "meta-llama/llama-3.1-70b-instruct",
827
- "Llama 3.1 70B",
828
- { limit: { context: 128000, output: 4096 } }
845
+ // Premium MaaS models via Vertex AI
846
+ "google/gemini-3-pro-preview": eliseartBaseModel(
847
+ "google/gemini-3-pro-preview",
848
+ "Gemini 3 Pro Preview",
849
+ {
850
+ cost: { input: 1.80, output: 10.80, cache: { read: 0, write: 0 } },
851
+ limit: { context: 1000000, output: 65536 },
852
+ capabilities: { temperature: true, reasoning: true, attachment: true, toolcall: true, input: { text: true, audio: false, image: true, video: true, pdf: true }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false }
853
+ }
829
854
  ),
830
- "meta-llama/llama-3.1-405b-instruct": eliseartBaseModel(
831
- "meta-llama/llama-3.1-405b-instruct",
832
- "Llama 3.1 405B",
833
- { limit: { context: 128000, output: 4096 } }
855
+ "zai-org/glm-4.7-maas": eliseartBaseModel(
856
+ "zai-org/glm-4.7-maas",
857
+ "GLM 4.7 (MaaS)",
858
+ { cost: { input: 0.25, output: 1.50, cache: { read: 0, write: 0 } } }
834
859
  ),
835
- "deepseek/deepseek-chat": eliseartBaseModel(
836
- "deepseek/deepseek-chat",
837
- "DeepSeek Chat",
838
- { limit: { context: 64000, output: 4096 } }
860
+ "moonshotai/kimi-k2-thinking-maas": eliseartBaseModel(
861
+ "moonshotai/kimi-k2-thinking-maas",
862
+ "Kimi K2 Thinking (MaaS)",
863
+ {
864
+ cost: { input: 1.00, output: 5.00, cache: { read: 0, write: 0 } },
865
+ capabilities: { temperature: true, reasoning: true, attachment: false, toolcall: true, input: { text: true, audio: false, image: false, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false }
866
+ }
867
+ ),
868
+ "deepseek-ai/deepseek-v3.2-maas": eliseartBaseModel(
869
+ "deepseek-ai/deepseek-v3.2-maas",
870
+ "DeepSeek V3.2 (MaaS)",
871
+ {
872
+ cost: { input: 0.54, output: 1.53, cache: { read: 0, write: 0 } },
873
+ capabilities: { temperature: true, reasoning: true, attachment: false, toolcall: true, input: { text: true, audio: false, image: false, video: false, pdf: false }, output: { text: true, audio: false, image: false, video: false, pdf: false }, interleaved: false }
874
+ }
839
875
  ),
840
- "mistralai/mistral-large": eliseartBaseModel(
841
- "mistralai/mistral-large",
842
- "Mistral Large",
843
- { limit: { context: 128000, output: 4096 } }
876
+ "openai/gpt-oss-120b-maas": eliseartBaseModel(
877
+ "openai/gpt-oss-120b-maas",
878
+ "GPT OSS 120B (MaaS)",
879
+ { cost: { input: 1.00, output: 3.00, cache: { read: 0, write: 0 } } }
880
+ ),
881
+ "meta/llama-3.1-405b-instruct-maas": eliseartBaseModel(
882
+ "meta/llama-3.1-405b-instruct-maas",
883
+ "Llama 3.1 405B (MaaS)",
884
+ {
885
+ cost: { input: 4.50, output: 14.40, cache: { read: 0, write: 0 } },
886
+ limit: { context: 128000, output: 4096 }
887
+ }
844
888
  ),
845
889
  }
846
890
  }
@@ -1211,7 +1255,7 @@ export namespace Provider {
1211
1255
  installedPath = model.api.npm
1212
1256
  }
1213
1257
 
1214
- const mod = await import(installedPath)
1258
+ const mod = await import(pathToFileURL(installedPath).href)
1215
1259
 
1216
1260
  const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!]
1217
1261
  const loaded = fn({
@@ -67,7 +67,7 @@ You are allowed to be proactive, but only when the user asks you to do something
67
67
  1. Doing the right thing when asked, including taking actions and follow-up actions
68
68
  2. Not surprising the user with actions you take without asking
69
69
  For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.
70
- 3. Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.
70
+ 3. IMPORTANT: After making edits to files, you MUST provide a brief summary (1-3 sentences) of what you changed and why. Do NOT just silently make changes and stop - users need to understand what was modified. Keep the summary concise but informative.
71
71
 
72
72
  # Following conventions
73
73
  When making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.
@@ -18,6 +18,7 @@ import { Config } from "../config/config"
18
18
  import path from "path"
19
19
  import { type ToolDefinition } from "@eliseart.ai/plugin"
20
20
  import z from "zod"
21
+ import { pathToFileURL } from "url"
21
22
  import { Plugin } from "../plugin"
22
23
  import { WebSearchTool } from "./websearch"
23
24
  import { CodeSearchTool } from "./codesearch"
@@ -43,7 +44,7 @@ export namespace ToolRegistry {
43
44
  dot: true,
44
45
  })) {
45
46
  const namespace = path.basename(match, path.extname(match))
46
- const mod = await import(match)
47
+ const mod = await import(pathToFileURL(match).href)
47
48
  for (const [id, def] of Object.entries<ToolDefinition>(mod)) {
48
49
  custom.push(fromPlugin(id === "default" ? namespace : `${namespace}_${id}`, def))
49
50
  }