borgmcp 0.9.58 → 0.9.60
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/dist/assimilate-cmd.d.ts.map +1 -1
- package/dist/assimilate-cmd.js +23 -5
- package/dist/assimilate-cmd.js.map +1 -1
- package/dist/claude.js +28 -4
- package/dist/claude.js.map +1 -1
- package/dist/codex-launch.d.ts +1 -0
- package/dist/codex-launch.d.ts.map +1 -1
- package/dist/codex-launch.js +4 -2
- package/dist/codex-launch.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -1
- package/dist/health-beat.d.ts +94 -0
- package/dist/health-beat.d.ts.map +1 -0
- package/dist/health-beat.js +133 -0
- package/dist/health-beat.js.map +1 -0
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/log-stream.d.ts +8 -0
- package/dist/log-stream.d.ts.map +1 -1
- package/dist/log-stream.js +23 -1
- package/dist/log-stream.js.map +1 -1
- package/dist/regen-format.d.ts.map +1 -1
- package/dist/regen-format.js +3 -1
- package/dist/regen-format.js.map +1 -1
- package/dist/roster-render.d.ts +2 -0
- package/dist/roster-render.d.ts.map +1 -1
- package/dist/roster-render.js +9 -3
- package/dist/roster-render.js.map +1 -1
- package/dist/token-store.d.ts +28 -0
- package/dist/token-store.d.ts.map +1 -1
- package/dist/token-store.js +97 -11
- package/dist/token-store.js.map +1 -1
- package/package.json +1 -1
package/dist/token-store.d.ts
CHANGED
|
@@ -51,11 +51,30 @@ export interface FileStoreFs {
|
|
|
51
51
|
readFile(filePath: string): Promise<string>;
|
|
52
52
|
writeFile(filePath: string, data: string, mode: number): Promise<void>;
|
|
53
53
|
mkdir(dir: string, mode: number): Promise<void>;
|
|
54
|
+
/** Atomically move `from`→`to` (overwrites). Used for crash-safe writes. */
|
|
55
|
+
rename(from: string, to: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Atomically create `lockPath` ONLY if it does not exist (O_EXCL). Resolves
|
|
58
|
+
* `true` if it was created (lock acquired) or `false` if it already existed
|
|
59
|
+
* (lock held by another process). This is the inter-process serialization
|
|
60
|
+
* primitive — no native dependency.
|
|
61
|
+
*/
|
|
62
|
+
createExclusive(lockPath: string, content: string): Promise<boolean>;
|
|
63
|
+
/** Remove a file; silent if already gone (lock release + stale-lock steal). */
|
|
64
|
+
removeFile(filePath: string): Promise<void>;
|
|
65
|
+
/** Age in ms (now − mtime) of a file, or null if it does not exist. */
|
|
66
|
+
fileAgeMs(filePath: string): Promise<number | null>;
|
|
54
67
|
}
|
|
55
68
|
export interface EncryptedFileBackendDeps {
|
|
56
69
|
filePath: string;
|
|
57
70
|
key: Buffer;
|
|
58
71
|
fs: FileStoreFs;
|
|
72
|
+
/** Backoff between lock-acquire retries; defaults to a real setTimeout sleep. */
|
|
73
|
+
sleep?: (ms: number) => Promise<void>;
|
|
74
|
+
/** Monotonic clock for the acquire deadline; defaults to Date.now. */
|
|
75
|
+
now?: () => number;
|
|
76
|
+
/** Unique suffix for the write temp file; defaults to a random hex token. */
|
|
77
|
+
uniqueSuffix?: () => string;
|
|
59
78
|
}
|
|
60
79
|
/**
|
|
61
80
|
* Build the encrypted-file backend. All accounts live in one JSON object
|
|
@@ -66,6 +85,15 @@ export interface EncryptedFileBackendDeps {
|
|
|
66
85
|
* treated as empty: the only consequence is the user re-runs `borg setup`,
|
|
67
86
|
* which is the right fail-safe for credential material — a hard crash on a
|
|
68
87
|
* corrupt dotfile would be worse UX than transparent re-auth.
|
|
88
|
+
*
|
|
89
|
+
* gh#570 — concurrency + atomicity. Multiple `borg` processes (e.g. sibling
|
|
90
|
+
* drone sessions on one host) can share `~/.borg/credentials`. Two fixes:
|
|
91
|
+
* - Anti-lost-update (load-bearing): `set`/`delete` serialize their whole
|
|
92
|
+
* read-modify-write cycle behind an O_EXCL lock file, so concurrent
|
|
93
|
+
* writers no longer each read a stale map and clobber each other.
|
|
94
|
+
* - Anti-corruption: every write goes to a unique temp file then `rename`s
|
|
95
|
+
* into place, so a reader (which is intentionally lock-FREE) always sees a
|
|
96
|
+
* complete old-or-new file, never a torn one.
|
|
69
97
|
*/
|
|
70
98
|
export declare function makeEncryptedFileBackend(deps: EncryptedFileBackendDeps): TokenBackend;
|
|
71
99
|
/** User-facing BORG_TOKEN_STORE values (friendlier than the backend names). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/token-store.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* keychain or disk.
|
|
20
20
|
*/
|
|
21
21
|
import path from 'path';
|
|
22
|
+
import crypto from 'crypto';
|
|
22
23
|
import { AsyncEntry } from '@napi-rs/keyring';
|
|
23
24
|
import { decryptString, encryptString } from './token-crypto.js';
|
|
24
25
|
const SERVICE_NAME = 'borg-mcp';
|
|
@@ -50,6 +51,21 @@ export function makeKeychainBackend(entryFactory = defaultEntryFactory) {
|
|
|
50
51
|
},
|
|
51
52
|
};
|
|
52
53
|
}
|
|
54
|
+
// gh#570 lock tuning. Token writes are tiny + infrequent, so a short retry
|
|
55
|
+
// cadence + a generous staleness window are right: the staleness window only
|
|
56
|
+
// has to exceed a real write (milliseconds), and a crashed lock-holder is
|
|
57
|
+
// reclaimed after it.
|
|
58
|
+
const LOCK_RETRY_DELAY_MS = 25;
|
|
59
|
+
const LOCK_MAX_WAIT_MS = 2000;
|
|
60
|
+
const LOCK_STALE_MS = 10_000;
|
|
61
|
+
function defaultSleep(ms) {
|
|
62
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
63
|
+
}
|
|
64
|
+
function defaultUniqueSuffix() {
|
|
65
|
+
// PID + random keeps two concurrent writers' temp files distinct so the
|
|
66
|
+
// temp write itself never races. crypto is already a client dependency.
|
|
67
|
+
return `${process.pid}.${crypto.randomBytes(6).toString('hex')}`;
|
|
68
|
+
}
|
|
53
69
|
/**
|
|
54
70
|
* Build the encrypted-file backend. All accounts live in one JSON object
|
|
55
71
|
* encrypted as a single AES-256-GCM envelope at `filePath`.
|
|
@@ -59,9 +75,22 @@ export function makeKeychainBackend(entryFactory = defaultEntryFactory) {
|
|
|
59
75
|
* treated as empty: the only consequence is the user re-runs `borg setup`,
|
|
60
76
|
* which is the right fail-safe for credential material — a hard crash on a
|
|
61
77
|
* corrupt dotfile would be worse UX than transparent re-auth.
|
|
78
|
+
*
|
|
79
|
+
* gh#570 — concurrency + atomicity. Multiple `borg` processes (e.g. sibling
|
|
80
|
+
* drone sessions on one host) can share `~/.borg/credentials`. Two fixes:
|
|
81
|
+
* - Anti-lost-update (load-bearing): `set`/`delete` serialize their whole
|
|
82
|
+
* read-modify-write cycle behind an O_EXCL lock file, so concurrent
|
|
83
|
+
* writers no longer each read a stale map and clobber each other.
|
|
84
|
+
* - Anti-corruption: every write goes to a unique temp file then `rename`s
|
|
85
|
+
* into place, so a reader (which is intentionally lock-FREE) always sees a
|
|
86
|
+
* complete old-or-new file, never a torn one.
|
|
62
87
|
*/
|
|
63
88
|
export function makeEncryptedFileBackend(deps) {
|
|
64
89
|
const { filePath, key, fs } = deps;
|
|
90
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
91
|
+
const now = deps.now ?? Date.now;
|
|
92
|
+
const uniqueSuffix = deps.uniqueSuffix ?? defaultUniqueSuffix;
|
|
93
|
+
const lockPath = `${filePath}.lock`;
|
|
65
94
|
async function readMap() {
|
|
66
95
|
let raw;
|
|
67
96
|
try {
|
|
@@ -81,25 +110,82 @@ export function makeEncryptedFileBackend(deps) {
|
|
|
81
110
|
}
|
|
82
111
|
async function writeMap(map) {
|
|
83
112
|
await fs.mkdir(path.dirname(filePath), 0o700);
|
|
84
|
-
|
|
113
|
+
// Atomic write: encrypt → temp → rename. rename preserves the temp's 0600.
|
|
114
|
+
const tmpPath = `${filePath}.${uniqueSuffix()}.tmp`;
|
|
115
|
+
await fs.writeFile(tmpPath, encryptString(JSON.stringify(map), key), 0o600);
|
|
116
|
+
try {
|
|
117
|
+
await fs.rename(tmpPath, filePath);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
// rename failed (disk full / permission). Remove the orphaned temp so
|
|
121
|
+
// repeated failures don't accumulate .tmp files, then rethrow so the
|
|
122
|
+
// caller still fails loud. Cleanup is best-effort — a failed unlink must
|
|
123
|
+
// not mask the original error.
|
|
124
|
+
try {
|
|
125
|
+
await fs.removeFile(tmpPath);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
/* ignore cleanup failure — the original rename error takes precedence */
|
|
129
|
+
}
|
|
130
|
+
throw err;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Run `fn` while holding the O_EXCL lock, serializing read-modify-write
|
|
135
|
+
* across processes. A lock left by a crashed holder is reclaimed once it is
|
|
136
|
+
* older than LOCK_STALE_MS. If the lock can't be acquired within
|
|
137
|
+
* LOCK_MAX_WAIT_MS, proceed best-effort (steal it): the worst case is the
|
|
138
|
+
* original benign lost-update, never a stuck auth.
|
|
139
|
+
*/
|
|
140
|
+
async function withFileLock(fn) {
|
|
141
|
+
const deadline = now() + LOCK_MAX_WAIT_MS;
|
|
142
|
+
let held = false;
|
|
143
|
+
while (!held) {
|
|
144
|
+
held = await fs.createExclusive(lockPath, `${process.pid}@${now()}`);
|
|
145
|
+
if (held)
|
|
146
|
+
break;
|
|
147
|
+
const age = await fs.fileAgeMs(lockPath);
|
|
148
|
+
if (age !== null && age > LOCK_STALE_MS) {
|
|
149
|
+
await fs.removeFile(lockPath); // reclaim a stale (crashed-holder) lock
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (now() >= deadline) {
|
|
153
|
+
await fs.removeFile(lockPath); // last resort: steal + proceed best-effort
|
|
154
|
+
held = await fs.createExclusive(lockPath, `${process.pid}@${now()}`);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
await sleep(LOCK_RETRY_DELAY_MS);
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
return await fn();
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
if (held)
|
|
164
|
+
await fs.removeFile(lockPath);
|
|
165
|
+
}
|
|
85
166
|
}
|
|
86
167
|
return {
|
|
87
168
|
name: 'encrypted-file',
|
|
88
169
|
async get(account) {
|
|
170
|
+
// Lock-free: temp+rename guarantees readMap sees a complete file.
|
|
89
171
|
const map = await readMap();
|
|
90
172
|
return Object.prototype.hasOwnProperty.call(map, account) ? map[account] : null;
|
|
91
173
|
},
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
},
|
|
97
|
-
async delete(account) {
|
|
98
|
-
const map = await readMap();
|
|
99
|
-
if (Object.prototype.hasOwnProperty.call(map, account)) {
|
|
100
|
-
delete map[account];
|
|
174
|
+
set(account, value) {
|
|
175
|
+
return withFileLock(async () => {
|
|
176
|
+
const map = await readMap();
|
|
177
|
+
map[account] = value;
|
|
101
178
|
await writeMap(map);
|
|
102
|
-
}
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
delete(account) {
|
|
182
|
+
return withFileLock(async () => {
|
|
183
|
+
const map = await readMap();
|
|
184
|
+
if (Object.prototype.hasOwnProperty.call(map, account)) {
|
|
185
|
+
delete map[account];
|
|
186
|
+
await writeMap(map);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
103
189
|
},
|
|
104
190
|
};
|
|
105
191
|
}
|
package/dist/token-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,YAAY,GAAG,UAAU,CAAC;AA8BhC,MAAM,mBAAmB,GAAwB,CAAC,OAAO,EAAE,EAAE,CAC3D,IAAI,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,eAAoC,mBAAmB;IAEvD,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK,CAAC,GAAG,CAAC,OAAO;YACf,OAAO,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK;YACtB,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAAO;YAClB,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;gBACvC,IAAI,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,OAAO;gBACxD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "borgmcp",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.60",
|
|
4
4
|
"description": "Coordinate AI coding agents in shared cubes. Works with Claude Code and Codex. Create projects, assign roles, and share a live activity log.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|