n2n-nexus 0.9.1 → 0.9.2
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/CHANGELOG.md +7 -0
- package/build/cli/install.js +24 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.9.2] - 2026-10-24
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- `n2n-nexus install` / `uninstall` write through a symlinked `settings.json` or `hooks.json` (account switchers such as PlanSwap share one file between config directories through a link) instead of replacing the link with a copy.
|
|
10
|
+
- A tray controlling the background service shows the address the service listens on (for example `http://0.0.0.0:5688 (LAN)`), not the loopback address it checks the service on.
|
|
11
|
+
|
|
5
12
|
## [0.9.1] - 2026-10-24
|
|
6
13
|
|
|
7
14
|
Clearer texts for the AI models that use n2n-nexus.
|
package/build/cli/install.js
CHANGED
|
@@ -181,11 +181,32 @@ function addOurEntries(config, client, command, commandWindows) {
|
|
|
181
181
|
: { type: "command", command: `${command} --wait`, ...(commandWindows ? { commandWindows: `${commandWindows} '--wait'` } : {}), timeout: HOOK_TIMEOUT_SEC };
|
|
182
182
|
hooks.Stop.push({ hooks: [wait] });
|
|
183
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* The file a config path really names: the target of a symlink (account
|
|
186
|
+
* switchers share one settings.json between config directories through a link,
|
|
187
|
+
* which a rename onto the link would replace), followed through every level.
|
|
188
|
+
*/
|
|
189
|
+
function linkTarget(file) {
|
|
190
|
+
for (let target = file, hops = 0; hops < 40; hops++) {
|
|
191
|
+
let stat;
|
|
192
|
+
try {
|
|
193
|
+
stat = fs.lstatSync(target);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return target; // missing (or a dangling link's target): written as is
|
|
197
|
+
}
|
|
198
|
+
if (!stat.isSymbolicLink())
|
|
199
|
+
return target;
|
|
200
|
+
target = path.resolve(path.dirname(target), fs.readlinkSync(target));
|
|
201
|
+
}
|
|
202
|
+
return file;
|
|
203
|
+
}
|
|
184
204
|
function writeConfig(file, config) {
|
|
185
|
-
|
|
186
|
-
|
|
205
|
+
const target = linkTarget(file);
|
|
206
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
207
|
+
const tmp = `${target}.${process.pid}.tmp`;
|
|
187
208
|
fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + "\n");
|
|
188
|
-
fs.renameSync(tmp,
|
|
209
|
+
fs.renameSync(tmp, target);
|
|
189
210
|
}
|
|
190
211
|
function mcpRemoveArgs(client) {
|
|
191
212
|
return client === "claude"
|