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.
@@ -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/config.db`. This is the persistent source of truth for model settings.
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
  ![Database Persistence System](./assets/batch_0003_database-persistence-system-a.png)
@@ -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/config.db "SELECT auth_type, model_name, endpoint_url, is_active FROM model_configs"
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/config.db "UPDATE model_configs SET is_active = 0"
84
- sqlite3 ~/.fss-link/config.db "UPDATE model_configs SET is_active = 1 WHERE auth_type = 'ollama' AND model_name = 'qwen3:4b'"
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/config.db "UPDATE model_configs SET endpoint_url = 'http://your-server:1234/v1' WHERE auth_type = 'lm-studio'"
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/config.db`
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. **Ollama `num_ctx`** from `/context` command or sampling params
107
- 4. **OpenAI-compatible `/models` endpoint** (vLLM `max_model_len`)
108
- 5. **Static lookup** for known models (Gemini variants)
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 for Ollama models:
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
- Ollama, LM Studio, OpenAI, Gemini, vLLM
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
  ![Multi-Provider Connection Hub](./assets/batch_0002_multiprovider-connection-hub-a.png)
42
42
  ### Connect Anywhere
43
- Local models via Ollama. Cloud providers (OpenAI, Gemini). Custom endpoints (vLLM, LM Studio).
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 Ollama (Local)
68
+ ### With BobAI / vLLM (Local)
69
69
 
70
70
  ```bash
71
- # Start Ollama with a model
72
- ollama run qwen3:4b
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.7.7",
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.7.5"
16
+ "sandboxImageUri": "ghcr.io/fsscoding/fss-link:1.9.0"
17
17
  },
18
18
  "scripts": {
19
19
  "start": "node scripts/start.js",
@@ -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}`, {
@@ -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. Get all workspaces and filter out the ones we don't want to version.
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 dir of workspaceDirs) {
45
- const pkgPath = resolve(process.cwd(), dir, 'package.json');
46
- try {
47
- const wsPkg = readJson(pkgPath);
48
- if (!workspacesToExclude.includes(wsPkg.name)) {
49
- workspacesToVersion.push(wsPkg.name);
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
- for (const workspaceName of workspacesToVersion) {
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}.`);