fss-link 1.7.7 → 1.9.1
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/README.md +7 -6
- package/bundle/fss-link-main.js +1402 -1151
- package/bundle/fss-link-main.js.bak-20260629 +4468 -0
- package/docs/CONFIGURATION.md +10 -26
- package/docs/README.md +5 -8
- package/package.json +2 -2
- package/scripts/build_package.js +8 -1
- package/scripts/prebundle-sync-dist.js +8 -0
- package/scripts/version.js +29 -18
package/docs/CONFIGURATION.md
CHANGED
|
@@ -10,21 +10,6 @@ FSS Link supports multiple LLM providers. Configure via CLI flags, environment v
|
|
|
10
10
|
2. **Database config** — persistent, survives restarts
|
|
11
11
|
3. **Environment variables** — traditional fallback
|
|
12
12
|
|
|
13
|
-
### Ollama
|
|
14
|
-
|
|
15
|
-
Local models via Ollama. Default port 11434.
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# CLI
|
|
19
|
-
fss-link --provider ollama --model qwen3:4b
|
|
20
|
-
|
|
21
|
-
# Or set the context window for large conversations
|
|
22
|
-
fss-link --provider ollama --model qwen3:4b
|
|
23
|
-
# Then use /context 32768 inside the session
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Context window**: Defaults to 32,768 tokens. Use the `/context` command to set a custom value that persists to the database.
|
|
27
|
-
|
|
28
13
|
### LM Studio
|
|
29
14
|
|
|
30
15
|
Local models via LM Studio. Default port 1234.
|
|
@@ -65,7 +50,7 @@ fss-link --provider gemini-api-key --model gemini-2.0-flash
|
|
|
65
50
|
|
|
66
51
|
## Database Configuration
|
|
67
52
|
|
|
68
|
-
FSS Link stores model configuration in a SQLite database at `~/.fss-link/
|
|
53
|
+
FSS Link stores model configuration in a SQLite database at `~/.fss-link/fss-link.db`. This is the persistent source of truth for model settings.
|
|
69
54
|
|
|
70
55
|
<!-- bobai:image-card width="6" -->
|
|
71
56
|

|
|
@@ -77,19 +62,19 @@ Your model choice survives restarts. CLI flags override, environment fallback.
|
|
|
77
62
|
|
|
78
63
|
```bash
|
|
79
64
|
# View current config
|
|
80
|
-
sqlite3 ~/.fss-link/
|
|
65
|
+
sqlite3 ~/.fss-link/fss-link.db "SELECT auth_type, model_name, endpoint_url, is_active FROM model_configs"
|
|
81
66
|
|
|
82
67
|
# Switch active model
|
|
83
|
-
sqlite3 ~/.fss-link/
|
|
84
|
-
sqlite3 ~/.fss-link/
|
|
68
|
+
sqlite3 ~/.fss-link/fss-link.db "UPDATE model_configs SET is_active = 0"
|
|
69
|
+
sqlite3 ~/.fss-link/fss-link.db "UPDATE model_configs SET is_active = 1 WHERE auth_type = 'bob-ai' AND model_name = 'qwen3.5-35b-a3b'"
|
|
85
70
|
|
|
86
71
|
# Change endpoint
|
|
87
|
-
sqlite3 ~/.fss-link/
|
|
72
|
+
sqlite3 ~/.fss-link/fss-link.db "UPDATE model_configs SET endpoint_url = 'http://your-server:1234/v1' WHERE auth_type = 'lm-studio'"
|
|
88
73
|
```
|
|
89
74
|
|
|
90
75
|
### Database Location
|
|
91
76
|
|
|
92
|
-
- Linux/macOS: `~/.fss-link/
|
|
77
|
+
- Linux/macOS: `~/.fss-link/fss-link.db`
|
|
93
78
|
- Data directory: `~/.fss-link/`
|
|
94
79
|
- Todos: `~/.fss-link/todos/`
|
|
95
80
|
|
|
@@ -103,10 +88,9 @@ The context window is the maximum number of tokens the model can process in a si
|
|
|
103
88
|
|
|
104
89
|
1. **Manual override** in `settings.json` (`chatCompression.contextWindow`)
|
|
105
90
|
2. **LM Studio API query** (auto-detected from server)
|
|
106
|
-
3. **
|
|
107
|
-
4. **
|
|
108
|
-
5. **
|
|
109
|
-
6. **Provider defaults**: Ollama 32k, LM Studio 32k, OpenAI-compat 128k
|
|
91
|
+
3. **OpenAI-compatible `/models` endpoint** (vLLM `max_model_len`)
|
|
92
|
+
4. **Static lookup** for known models (Gemini variants)
|
|
93
|
+
5. **Provider defaults**: LM Studio 32k, OpenAI-compat 128k
|
|
110
94
|
|
|
111
95
|
### Compression
|
|
112
96
|
|
|
@@ -128,7 +112,7 @@ Full detail on recent context, compressed summaries for older messages.
|
|
|
128
112
|
|
|
129
113
|
### The `/context` Command
|
|
130
114
|
|
|
131
|
-
Set the context window
|
|
115
|
+
Set the context window size:
|
|
132
116
|
|
|
133
117
|
```
|
|
134
118
|
/context 32768 # Set to 32k
|
package/docs/README.md
CHANGED
|
@@ -21,7 +21,7 @@ $ fss-link
|
|
|
21
21
|
## Key Features
|
|
22
22
|
|
|
23
23
|
<!-- bobai:badges -->
|
|
24
|
-
|
|
24
|
+
LM Studio, BobAI, OpenAI, Gemini, vLLM
|
|
25
25
|
<!-- /bobai:badges -->
|
|
26
26
|
|
|
27
27
|
- **Multi-provider support** — Connect to any LLM (local or cloud)
|
|
@@ -40,7 +40,7 @@ Ollama, LM Studio, OpenAI, Gemini, vLLM
|
|
|
40
40
|
<!-- bobai:image-card width="6" -->
|
|
41
41
|

|
|
42
42
|
### Connect Anywhere
|
|
43
|
-
Local models via
|
|
43
|
+
Local models via LM Studio and BobAI. Cloud providers (OpenAI, Gemini). Custom endpoints (vLLM).
|
|
44
44
|
<!-- /bobai:image-card -->
|
|
45
45
|
|
|
46
46
|
## Installation
|
|
@@ -65,14 +65,11 @@ npm install -g .
|
|
|
65
65
|
|
|
66
66
|
## Quick Start
|
|
67
67
|
|
|
68
|
-
### With
|
|
68
|
+
### With BobAI / vLLM (Local)
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# Launch FSS Link
|
|
75
|
-
fss-link --provider ollama --model qwen3:4b
|
|
71
|
+
export BOB_AI_BASE_URL="http://your-server:8000/v1"
|
|
72
|
+
fss-link --provider bob-ai --model qwen3.5-35b-a3b
|
|
76
73
|
```
|
|
77
74
|
|
|
78
75
|
### With LM Studio (Local)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fss-link",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=20.0.0"
|
|
6
6
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"url": "git+https://github.com/FSSCoding/fss-link.git"
|
|
14
14
|
},
|
|
15
15
|
"config": {
|
|
16
|
-
"sandboxImageUri": "ghcr.io/fsscoding/fss-link:1.
|
|
16
|
+
"sandboxImageUri": "ghcr.io/fsscoding/fss-link:1.9.0"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
19
|
"start": "node scripts/start.js",
|
package/scripts/build_package.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// limitations under the License.
|
|
19
19
|
|
|
20
20
|
import { execSync } from 'child_process';
|
|
21
|
-
import { writeFileSync } from 'fs';
|
|
21
|
+
import { writeFileSync, rmSync } from 'fs';
|
|
22
22
|
import { join } from 'path';
|
|
23
23
|
|
|
24
24
|
if (!process.cwd().includes('packages')) {
|
|
@@ -26,6 +26,13 @@ if (!process.cwd().includes('packages')) {
|
|
|
26
26
|
process.exit(1);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
// Clean dist first — `tsc --build` is incremental and trusts its
|
|
30
|
+
// .tsbuildinfo cache. Any prior partial `rm -rf dist` or interrupted build
|
|
31
|
+
// leaves that cache out of sync with what's actually on disk, which surfaces
|
|
32
|
+
// as TS5055 "Cannot write file ... because it would overwrite input file".
|
|
33
|
+
// Same fix already applied in prebundle-sync-dist.js for the bundle path.
|
|
34
|
+
rmSync(join(process.cwd(), 'dist'), { recursive: true, force: true });
|
|
35
|
+
|
|
29
36
|
// build typescript files
|
|
30
37
|
execSync('tsc --build', { stdio: 'inherit' });
|
|
31
38
|
|
|
@@ -24,6 +24,14 @@ const root = resolve(__dirname, '..');
|
|
|
24
24
|
const packages = ['packages/core', 'packages/cli'];
|
|
25
25
|
|
|
26
26
|
for (const pkg of packages) {
|
|
27
|
+
// Clean dist first to avoid incremental build cache corruption that
|
|
28
|
+
// produces mangled output (e.g. #; private fields, broken syntax).
|
|
29
|
+
// See: incremental tsbuildinfo gets out of sync with source changes.
|
|
30
|
+
const { execSync } = await import('child_process');
|
|
31
|
+
const { rm } = await import('fs/promises');
|
|
32
|
+
const { resolve } = await import('path');
|
|
33
|
+
const distDir = resolve(root, pkg, 'dist');
|
|
34
|
+
try { await rm(distDir, { recursive: true, force: true }); } catch {}
|
|
27
35
|
const tsconfig = resolve(root, pkg, 'tsconfig.json');
|
|
28
36
|
try {
|
|
29
37
|
execSync(`npx tsc --noCheck -p ${tsconfig}`, {
|
package/scripts/version.js
CHANGED
|
@@ -36,33 +36,44 @@ if (!versionType) {
|
|
|
36
36
|
// 2. Bump the version in the root and all workspace package.json files.
|
|
37
37
|
run(`npm version ${versionType} --no-git-tag-version --allow-same-version`);
|
|
38
38
|
|
|
39
|
-
// 3.
|
|
40
|
-
const workspacesToExclude = [
|
|
39
|
+
// 3. Resolve workspace globs and collect all workspace names.
|
|
40
|
+
const workspacesToExclude = [
|
|
41
|
+
'fss-link-vscode-ide-companion',
|
|
42
|
+
'@fsscoding/fss-link-web-client',
|
|
43
|
+
];
|
|
41
44
|
const rootPkg = readJson(resolve(process.cwd(), 'package.json'));
|
|
42
45
|
const workspaceDirs = rootPkg.workspaces || [];
|
|
46
|
+
const { glob } = await import('glob');
|
|
43
47
|
const workspacesToVersion = [];
|
|
44
|
-
for (const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
for (const pattern of workspaceDirs) {
|
|
49
|
+
const matches = await glob(pattern, { cwd: process.cwd(), absolute: false });
|
|
50
|
+
for (const dir of matches) {
|
|
51
|
+
const pkgPath = resolve(process.cwd(), dir, 'package.json');
|
|
52
|
+
try {
|
|
53
|
+
const wsPkg = readJson(pkgPath);
|
|
54
|
+
if (!workspacesToExclude.includes(wsPkg.name)) {
|
|
55
|
+
workspacesToVersion.push({ name: wsPkg.name, dir });
|
|
56
|
+
}
|
|
57
|
+
} catch {
|
|
58
|
+
// Skip directories without package.json
|
|
50
59
|
}
|
|
51
|
-
} catch {
|
|
52
|
-
// Skip directories without package.json
|
|
53
60
|
}
|
|
54
61
|
}
|
|
55
62
|
|
|
56
|
-
|
|
57
|
-
run(
|
|
58
|
-
`npm version ${versionType} --workspace ${workspaceName} --no-git-tag-version --allow-same-version`,
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// 4. Get the new version number from the root package.json
|
|
63
|
+
// 4. Get the new version number from the root package.json (AFTER npm version bump)
|
|
63
64
|
const rootPackageJsonPath = resolve(process.cwd(), 'package.json');
|
|
64
65
|
const newVersion = readJson(rootPackageJsonPath).version;
|
|
65
66
|
|
|
67
|
+
for (const { name, dir } of workspacesToVersion) {
|
|
68
|
+
// npm version doesn't support --legacy-peer-deps, so we update the file directly
|
|
69
|
+
// and let the final npm install reconcile everything
|
|
70
|
+
const pkgPath = resolve(process.cwd(), dir, 'package.json');
|
|
71
|
+
const wsPkg = readJson(pkgPath);
|
|
72
|
+
wsPkg.version = newVersion;
|
|
73
|
+
writeJson(pkgPath, wsPkg);
|
|
74
|
+
console.log(`Updated ${name} to v${newVersion}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
66
77
|
// 6. Update the sandboxImageUri in the root package.json
|
|
67
78
|
const rootPackageJson = readJson(rootPackageJsonPath);
|
|
68
79
|
if (rootPackageJson.config?.sandboxImageUri) {
|
|
@@ -86,6 +97,6 @@ if (cliPackageJson.config?.sandboxImageUri) {
|
|
|
86
97
|
|
|
87
98
|
// 8. Run `npm install` to update package-lock.json.
|
|
88
99
|
// --ignore-scripts prevents the prepare hook (bundle) from firing before deps exist.
|
|
89
|
-
run('npm install --ignore-scripts');
|
|
100
|
+
run('npm install --ignore-scripts --legacy-peer-deps');
|
|
90
101
|
|
|
91
102
|
console.log(`Successfully bumped versions to v${newVersion}.`);
|