fss-link 1.2.21 → 1.2.23
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/bundle/fss-link.js +148 -17
- package/package.json +1 -1
package/bundle/fss-link.js
CHANGED
|
@@ -19872,7 +19872,11 @@ var init_openaiContentGenerator = __esm({
|
|
|
19872
19872
|
if (this.contentGeneratorConfig.authType === "ollama") {
|
|
19873
19873
|
return true;
|
|
19874
19874
|
}
|
|
19875
|
-
|
|
19875
|
+
const baseUrl = this.contentGeneratorConfig.baseUrl;
|
|
19876
|
+
if (!baseUrl)
|
|
19877
|
+
return false;
|
|
19878
|
+
return baseUrl.includes("localhost:11434") || baseUrl.includes("127.0.0.1:11434") || baseUrl.includes(":11434/v1") || baseUrl.includes(":11435/v1") || // Support proxy port
|
|
19879
|
+
baseUrl.includes("/ollama");
|
|
19876
19880
|
}
|
|
19877
19881
|
/**
|
|
19878
19882
|
* Determine if this is a custom OpenAI-compatible endpoint (proxy, local server, etc.)
|
|
@@ -22226,6 +22230,28 @@ var init_qwenContentGenerator = __esm({
|
|
|
22226
22230
|
|
|
22227
22231
|
// packages/core/dist/src/core/contentGenerator.js
|
|
22228
22232
|
import { GoogleGenAI } from "@google/genai";
|
|
22233
|
+
function normalizeOpenAICompatibleBaseUrl(url2, provider) {
|
|
22234
|
+
if (!url2) {
|
|
22235
|
+
throw new Error(`${provider} base URL is required`);
|
|
22236
|
+
}
|
|
22237
|
+
let normalized2 = url2.replace(/\/+$/, "");
|
|
22238
|
+
if (normalized2.endsWith("/v1/v1")) {
|
|
22239
|
+
normalized2 = normalized2.slice(0, -3);
|
|
22240
|
+
if (DEBUG_CONTENT)
|
|
22241
|
+
console.log(`\u26A0\uFE0F ${provider}: Removed duplicate /v1 from URL: ${url2} \u2192 ${normalized2}`);
|
|
22242
|
+
}
|
|
22243
|
+
if (!normalized2.endsWith("/v1")) {
|
|
22244
|
+
normalized2 = `${normalized2}/v1`;
|
|
22245
|
+
if (DEBUG_CONTENT)
|
|
22246
|
+
console.log(`\u2705 ${provider}: Added /v1 suffix to URL: ${url2} \u2192 ${normalized2}`);
|
|
22247
|
+
}
|
|
22248
|
+
try {
|
|
22249
|
+
new URL(normalized2);
|
|
22250
|
+
} catch (error) {
|
|
22251
|
+
throw new Error(`${provider}: Invalid base URL after normalization: ${normalized2}`);
|
|
22252
|
+
}
|
|
22253
|
+
return normalized2;
|
|
22254
|
+
}
|
|
22229
22255
|
async function createContentGeneratorConfig(config, authType) {
|
|
22230
22256
|
const geminiApiKey = process.env["GEMINI_API_KEY"] || void 0;
|
|
22231
22257
|
const googleApiKey = process.env["GOOGLE_API_KEY"] || void 0;
|
|
@@ -22281,7 +22307,8 @@ async function createContentGeneratorConfig(config, authType) {
|
|
|
22281
22307
|
if (authType === AuthType.OLLAMA) {
|
|
22282
22308
|
if (ollamaApiKey) {
|
|
22283
22309
|
contentGeneratorConfig.apiKey = ollamaApiKey;
|
|
22284
|
-
|
|
22310
|
+
const rawBaseUrl = ollamaBaseUrl || "http://localhost:11434/v1";
|
|
22311
|
+
contentGeneratorConfig.baseUrl = normalizeOpenAICompatibleBaseUrl(rawBaseUrl, "Ollama");
|
|
22285
22312
|
contentGeneratorConfig.model = ollamaModel || "qwen3-coder-4b";
|
|
22286
22313
|
return contentGeneratorConfig;
|
|
22287
22314
|
}
|
|
@@ -22300,7 +22327,7 @@ async function createContentGeneratorConfig(config, authType) {
|
|
|
22300
22327
|
if (DEBUG_CONTENT)
|
|
22301
22328
|
console.log("\u{1F527} Using Ollama defaults: http://localhost:11434/v1");
|
|
22302
22329
|
contentGeneratorConfig.apiKey = "1";
|
|
22303
|
-
contentGeneratorConfig.baseUrl = "http://localhost:11434/v1";
|
|
22330
|
+
contentGeneratorConfig.baseUrl = normalizeOpenAICompatibleBaseUrl("http://localhost:11434/v1", "Ollama");
|
|
22304
22331
|
const configModel = config.getModel();
|
|
22305
22332
|
const finalModel = ollamaModel || configModel || "qwen3-coder-4b";
|
|
22306
22333
|
contentGeneratorConfig.model = finalModel;
|
|
@@ -22311,7 +22338,8 @@ async function createContentGeneratorConfig(config, authType) {
|
|
|
22311
22338
|
if (authType === AuthType.LM_STUDIO) {
|
|
22312
22339
|
if (lmStudioApiKey) {
|
|
22313
22340
|
contentGeneratorConfig.apiKey = lmStudioApiKey;
|
|
22314
|
-
|
|
22341
|
+
const rawBaseUrl = lmStudioBaseUrl || "http://localhost:1234/v1";
|
|
22342
|
+
contentGeneratorConfig.baseUrl = normalizeOpenAICompatibleBaseUrl(rawBaseUrl, "LM Studio");
|
|
22315
22343
|
contentGeneratorConfig.model = lmStudioModel || "qwen3-coder-4b";
|
|
22316
22344
|
return contentGeneratorConfig;
|
|
22317
22345
|
}
|
|
@@ -22330,7 +22358,7 @@ async function createContentGeneratorConfig(config, authType) {
|
|
|
22330
22358
|
if (DEBUG_CONTENT)
|
|
22331
22359
|
console.log("\u{1F527} Using LM Studio defaults: http://localhost:1234/v1");
|
|
22332
22360
|
contentGeneratorConfig.apiKey = "1";
|
|
22333
|
-
contentGeneratorConfig.baseUrl = "http://localhost:1234/v1";
|
|
22361
|
+
contentGeneratorConfig.baseUrl = normalizeOpenAICompatibleBaseUrl("http://localhost:1234/v1", "LM Studio");
|
|
22334
22362
|
const configModel = config.getModel();
|
|
22335
22363
|
const finalModel = lmStudioModel || configModel || "qwen3-coder-4b";
|
|
22336
22364
|
contentGeneratorConfig.model = finalModel;
|
|
@@ -22343,7 +22371,7 @@ async function createContentGeneratorConfig(config, authType) {
|
|
|
22343
22371
|
async function createContentGenerator(config, gcConfig, sessionId2) {
|
|
22344
22372
|
if (DEBUG_CONTENT)
|
|
22345
22373
|
console.log(`\u{1F41B} DEBUG createContentGenerator: authType=${config.authType}, apiKey=${config.apiKey}, baseUrl=${config.baseUrl}`);
|
|
22346
|
-
const version = "1.2.
|
|
22374
|
+
const version = "1.2.23";
|
|
22347
22375
|
const userAgent = `FSS-Link/${version} (${process.platform}; ${process.arch})`;
|
|
22348
22376
|
const baseHeaders = {
|
|
22349
22377
|
"User-Agent": userAgent
|
|
@@ -60795,7 +60823,59 @@ var init_project_structure = __esm({
|
|
|
60795
60823
|
type: "array",
|
|
60796
60824
|
description: 'Patterns to exclude (e.g., ["node_modules", "*.log"])',
|
|
60797
60825
|
items: { type: "string" },
|
|
60798
|
-
default: [
|
|
60826
|
+
default: [
|
|
60827
|
+
// Version control
|
|
60828
|
+
".git",
|
|
60829
|
+
".svn",
|
|
60830
|
+
".hg",
|
|
60831
|
+
// JavaScript/Node.js
|
|
60832
|
+
"node_modules",
|
|
60833
|
+
".npm",
|
|
60834
|
+
".yarn",
|
|
60835
|
+
"bower_components",
|
|
60836
|
+
// Python virtualenvs (directories only)
|
|
60837
|
+
"venv",
|
|
60838
|
+
".venv",
|
|
60839
|
+
"virtualenv",
|
|
60840
|
+
// Python cache and artifacts
|
|
60841
|
+
"__pycache__",
|
|
60842
|
+
"*.pyc",
|
|
60843
|
+
".pytest_cache",
|
|
60844
|
+
".tox",
|
|
60845
|
+
".mypy_cache",
|
|
60846
|
+
".ruff_cache",
|
|
60847
|
+
"site-packages",
|
|
60848
|
+
"*.egg-info",
|
|
60849
|
+
".eggs",
|
|
60850
|
+
// Build outputs
|
|
60851
|
+
"dist",
|
|
60852
|
+
"build",
|
|
60853
|
+
"out",
|
|
60854
|
+
// Coverage/Testing
|
|
60855
|
+
"coverage",
|
|
60856
|
+
".nyc_output",
|
|
60857
|
+
".coverage",
|
|
60858
|
+
"htmlcov",
|
|
60859
|
+
// Ruby
|
|
60860
|
+
".bundle",
|
|
60861
|
+
"vendor",
|
|
60862
|
+
// Java/JVM
|
|
60863
|
+
".gradle",
|
|
60864
|
+
".m2",
|
|
60865
|
+
"target",
|
|
60866
|
+
// IDE/Editor
|
|
60867
|
+
".idea",
|
|
60868
|
+
".vscode",
|
|
60869
|
+
".vs",
|
|
60870
|
+
"*.swp",
|
|
60871
|
+
"*.swo",
|
|
60872
|
+
// OS
|
|
60873
|
+
".DS_Store",
|
|
60874
|
+
"Thumbs.db",
|
|
60875
|
+
// Temporary
|
|
60876
|
+
".tmp",
|
|
60877
|
+
".cache"
|
|
60878
|
+
]
|
|
60799
60879
|
},
|
|
60800
60880
|
size_analysis: {
|
|
60801
60881
|
type: "boolean",
|
|
@@ -60852,7 +60932,48 @@ Features:
|
|
|
60852
60932
|
return `Analyze project structure (${analysis_type}) for ${target}`;
|
|
60853
60933
|
}
|
|
60854
60934
|
async execute(_signal) {
|
|
60855
|
-
const { target = ".", analysis_type = "overview", max_depth = 5, show_hidden = false, file_types, exclude_patterns = [
|
|
60935
|
+
const { target = ".", analysis_type = "overview", max_depth = 5, show_hidden = false, file_types, exclude_patterns = [
|
|
60936
|
+
".git",
|
|
60937
|
+
".svn",
|
|
60938
|
+
".hg",
|
|
60939
|
+
"node_modules",
|
|
60940
|
+
".npm",
|
|
60941
|
+
".yarn",
|
|
60942
|
+
"bower_components",
|
|
60943
|
+
"venv",
|
|
60944
|
+
".venv",
|
|
60945
|
+
"virtualenv",
|
|
60946
|
+
"__pycache__",
|
|
60947
|
+
"*.pyc",
|
|
60948
|
+
".pytest_cache",
|
|
60949
|
+
".tox",
|
|
60950
|
+
".mypy_cache",
|
|
60951
|
+
".ruff_cache",
|
|
60952
|
+
"site-packages",
|
|
60953
|
+
"*.egg-info",
|
|
60954
|
+
".eggs",
|
|
60955
|
+
"dist",
|
|
60956
|
+
"build",
|
|
60957
|
+
"out",
|
|
60958
|
+
"coverage",
|
|
60959
|
+
".nyc_output",
|
|
60960
|
+
".coverage",
|
|
60961
|
+
"htmlcov",
|
|
60962
|
+
".bundle",
|
|
60963
|
+
"vendor",
|
|
60964
|
+
".gradle",
|
|
60965
|
+
".m2",
|
|
60966
|
+
"target",
|
|
60967
|
+
".idea",
|
|
60968
|
+
".vscode",
|
|
60969
|
+
".vs",
|
|
60970
|
+
"*.swp",
|
|
60971
|
+
"*.swo",
|
|
60972
|
+
".DS_Store",
|
|
60973
|
+
"Thumbs.db",
|
|
60974
|
+
".tmp",
|
|
60975
|
+
".cache"
|
|
60976
|
+
], size_analysis = true, git_awareness = true, query } = this.params;
|
|
60856
60977
|
try {
|
|
60857
60978
|
const targetPath = path27.resolve(target);
|
|
60858
60979
|
try {
|
|
@@ -61048,7 +61169,7 @@ Features:
|
|
|
61048
61169
|
const fullFilePath = path27.join(fullPath, fileName);
|
|
61049
61170
|
if (!showHidden && fileName.startsWith("."))
|
|
61050
61171
|
continue;
|
|
61051
|
-
if (excludePatterns.some((pattern) =>
|
|
61172
|
+
if (excludePatterns.some((pattern) => this.matchesExcludePattern(fileName, filePath, entry.isDirectory(), pattern)))
|
|
61052
61173
|
continue;
|
|
61053
61174
|
try {
|
|
61054
61175
|
const stats = await fs23.stat(fullFilePath);
|
|
@@ -61076,6 +61197,20 @@ Features:
|
|
|
61076
61197
|
}
|
|
61077
61198
|
return files;
|
|
61078
61199
|
}
|
|
61200
|
+
/**
|
|
61201
|
+
* Check if a file/directory matches an exclude pattern
|
|
61202
|
+
* Supports glob patterns (*.ext) and exact directory/file name matching
|
|
61203
|
+
*/
|
|
61204
|
+
matchesExcludePattern(fileName, filePath, isDirectory, pattern) {
|
|
61205
|
+
if (pattern.includes("*")) {
|
|
61206
|
+
const regex2 = new RegExp("^" + pattern.replace(/\./g, "\\.").replace(/\*/g, ".*") + "$");
|
|
61207
|
+
return regex2.test(fileName);
|
|
61208
|
+
}
|
|
61209
|
+
if (isDirectory) {
|
|
61210
|
+
return fileName === pattern || filePath.split("/").includes(pattern);
|
|
61211
|
+
}
|
|
61212
|
+
return fileName === pattern;
|
|
61213
|
+
}
|
|
61079
61214
|
getFileIcon(fileName, isDirectory) {
|
|
61080
61215
|
if (isDirectory) {
|
|
61081
61216
|
const dirIcons = {
|
|
@@ -68981,7 +69116,7 @@ var init_turn = __esm({
|
|
|
68981
69116
|
/*curated*/
|
|
68982
69117
|
true
|
|
68983
69118
|
), req];
|
|
68984
|
-
await reportError(error, "Error when talking to
|
|
69119
|
+
await reportError(error, "Error when talking to Gemini API", contextForReport, "Turn.run-sendMessageStream");
|
|
68985
69120
|
const status = typeof error === "object" && error !== null && "status" in error && typeof error.status === "number" ? error.status : void 0;
|
|
68986
69121
|
const structuredError = {
|
|
68987
69122
|
message: getErrorMessage(error),
|
|
@@ -84384,7 +84519,6 @@ var init_model_database = __esm({
|
|
|
84384
84519
|
);
|
|
84385
84520
|
}
|
|
84386
84521
|
if (normalizedModelName && normalizedModelName !== "") {
|
|
84387
|
-
console.log(`\u{1F50D} [LEVEL 2.5] Searching for existing model: ${config.authType}/${normalizedModelName}`);
|
|
84388
84522
|
existingRecord = await safeQueryFirstWithLocking(
|
|
84389
84523
|
this.db,
|
|
84390
84524
|
`SELECT id FROM model_configs
|
|
@@ -84394,7 +84528,6 @@ var init_model_database = __esm({
|
|
|
84394
84528
|
[config.authType, normalizedModelName]
|
|
84395
84529
|
);
|
|
84396
84530
|
if (existingRecord) {
|
|
84397
|
-
console.log(`\u2705 [LEVEL 2.5] Found existing record id=${existingRecord.id}, updating endpoint_url to: ${normalizedEndpointUrl}`);
|
|
84398
84531
|
return await this.updateModelRecord(
|
|
84399
84532
|
existingRecord.id,
|
|
84400
84533
|
config,
|
|
@@ -84402,8 +84535,6 @@ var init_model_database = __esm({
|
|
|
84402
84535
|
normalizedEndpointUrl,
|
|
84403
84536
|
encryptedApiKey
|
|
84404
84537
|
);
|
|
84405
|
-
} else {
|
|
84406
|
-
console.log(`\u26A0\uFE0F [LEVEL 2.5] No existing record found, will insert new`);
|
|
84407
84538
|
}
|
|
84408
84539
|
}
|
|
84409
84540
|
if (!normalizedModelName || normalizedModelName === "") {
|
|
@@ -95452,7 +95583,7 @@ async function getPackageJson() {
|
|
|
95452
95583
|
// packages/cli/src/utils/version.ts
|
|
95453
95584
|
async function getCliVersion() {
|
|
95454
95585
|
const pkgJson = await getPackageJson();
|
|
95455
|
-
return "1.2.
|
|
95586
|
+
return "1.2.23";
|
|
95456
95587
|
}
|
|
95457
95588
|
|
|
95458
95589
|
// packages/cli/src/ui/commands/aboutCommand.ts
|
|
@@ -95504,7 +95635,7 @@ import open4 from "open";
|
|
|
95504
95635
|
import process11 from "node:process";
|
|
95505
95636
|
|
|
95506
95637
|
// packages/cli/src/generated/git-commit.ts
|
|
95507
|
-
var GIT_COMMIT_INFO = "
|
|
95638
|
+
var GIT_COMMIT_INFO = "24c3ac5b";
|
|
95508
95639
|
|
|
95509
95640
|
// packages/cli/src/ui/commands/bugCommand.ts
|
|
95510
95641
|
init_dist2();
|
|
@@ -118361,7 +118492,7 @@ var SETTINGS_SCHEMA = {
|
|
|
118361
118492
|
label: "Enable Checkpointing",
|
|
118362
118493
|
category: "Checkpointing",
|
|
118363
118494
|
requiresRestart: true,
|
|
118364
|
-
default:
|
|
118495
|
+
default: true,
|
|
118365
118496
|
description: "Enable session checkpointing for recovery",
|
|
118366
118497
|
showInDialog: false
|
|
118367
118498
|
}
|