@dsh-cc/mcp-client 0.8.2 → 0.8.3

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.
@@ -63,4 +63,40 @@ export declare function stdioStderrTail(transport: Transport): string;
63
63
  * mid-rotation; async fs here would reintroduce real races.
64
64
  */
65
65
  export declare function attachStdioStderrDrain(transport: StdioClientTransport, serverName: string, logDir?: string, maxBytes?: number): void;
66
+ export interface StdioStderrSink {
67
+ /** Append one pipe chunk: lazy-open, write, rotate when the tally crosses the cap. */
68
+ write(chunk: Buffer | string): void;
69
+ /**
70
+ * End every generation stream; resolves after their fds are closed (all
71
+ * buffered bytes flushed), so deterministic tests can await it.
72
+ */
73
+ close(): Promise<void>;
74
+ }
75
+ /**
76
+ * Deterministic seam for the byte-routing/rotation decision: the exact
77
+ * production routing a live pipe chunk receives, but chunk boundaries are
78
+ * caller-driven inputs instead of OS-scheduling artifacts (delayed pipe
79
+ * consumption coalesces 60ms-spaced child writes). `attachStdioStderrDrain`
80
+ * delegates every `data` event here, so tests drive coalesced or per-chunk
81
+ * input deterministically without changing production behavior.
82
+ *
83
+ * ponytail: rotation is size-based with one backup generation (the previous
84
+ * `.log.1` is discarded on each rotation); concurrent dsh-cc sessions sharing
85
+ * a serverName may interleave (session header marks each generation);
86
+ * WriteStream buffer grows if the disk stalls — log must never block MCP.
87
+ * Documented rotation edges: (a) bytes buffered in the old stream at rotation
88
+ * time flush into `.log.1` after the rename — a crash between rename and
89
+ * flush loses at most one stream buffer; (b) another session holding the
90
+ * renamed `.log.1` writes into an anonymous inode whose bytes vanish on
91
+ * close — worst-case extra disk ≈ maxBytes × live sessions. A failed
92
+ * rotation rename (e.g. `.log.1` is a directory) sets `rotationDisabled` so
93
+ * appending cannot become a rename-retry storm per chunk; appending then
94
+ * grows unbounded, which is exactly the pre-rotation worst case.
95
+ *
96
+ * INVARIANT: all rotation fs ops (`statSync`/`renameSync`/`createWriteStream`)
97
+ * are SYNCHRONOUS and run inside `write`. PassThrough `data` events cannot
98
+ * interleave, and the `end` handler cannot fire mid-rotation; async fs here
99
+ * would reintroduce real races.
100
+ */
101
+ export declare function createStdioStderrSink(path: string, maxBytes?: number): StdioStderrSink;
66
102
  //# sourceMappingURL=stdio-stderr.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-stderr.d.ts","sourceRoot":"","sources":["../src/stdio-stderr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAE9E,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,QAAW,CAAA;AAC5C,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,QAAkB,CAAA;AAIlD;;;;GAIG;AACH,qBAAa,WAAW;IAEV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADrC,OAAO,CAAC,MAAM,CAAK;gBACU,QAAQ,EAAE,MAAM;IAE7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzB,QAAQ,IAAI,MAAM;CAGnB;AAUD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMzE;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,oBAAoB,EAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,MAA4B,GACrC,IAAI,CAiDN"}
1
+ {"version":3,"file":"stdio-stderr.d.ts","sourceRoot":"","sources":["../src/stdio-stderr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAE9E,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,QAAW,CAAA;AAC5C,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,QAAkB,CAAA;AAIlD;;;;GAIG;AACH,qBAAa,WAAW;IAEV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADrC,OAAO,CAAC,MAAM,CAAK;gBACU,QAAQ,EAAE,MAAM;IAE7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzB,QAAQ,IAAI,MAAM;CAGnB;AAUD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMzE;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,oBAAoB,EAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,MAA4B,GACrC,IAAI,CAeN;AAED,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA4B,GAAG,eAAe,CAmD3G"}
@@ -95,8 +95,44 @@ export function attachStdioStderrDrain(transport, serverName, logDir, maxBytes =
95
95
  return;
96
96
  const tail = new BoundedTail(STDERR_TAIL_CAPACITY);
97
97
  tails.set(transport, tail);
98
- const dir = logDir ?? defaultStdioLogDir();
99
- const path = join(dir, `${serverName}.log`);
98
+ const sink = createStdioStderrSink(join(logDir ?? defaultStdioLogDir(), `${serverName}.log`), maxBytes);
99
+ stream.on('data', (chunk) => {
100
+ const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
101
+ tail.push(bytes.toString('utf8'));
102
+ sink.write(bytes);
103
+ });
104
+ // SDK close() does not destroy the PassThrough; the child's stderr `end`
105
+ // does. Keep the data listener through SIGTERM grace so the last crash
106
+ // line lands in both the ring and the file.
107
+ stream.on('end', () => sink.close());
108
+ }
109
+ /**
110
+ * Deterministic seam for the byte-routing/rotation decision: the exact
111
+ * production routing a live pipe chunk receives, but chunk boundaries are
112
+ * caller-driven inputs instead of OS-scheduling artifacts (delayed pipe
113
+ * consumption coalesces 60ms-spaced child writes). `attachStdioStderrDrain`
114
+ * delegates every `data` event here, so tests drive coalesced or per-chunk
115
+ * input deterministically without changing production behavior.
116
+ *
117
+ * ponytail: rotation is size-based with one backup generation (the previous
118
+ * `.log.1` is discarded on each rotation); concurrent dsh-cc sessions sharing
119
+ * a serverName may interleave (session header marks each generation);
120
+ * WriteStream buffer grows if the disk stalls — log must never block MCP.
121
+ * Documented rotation edges: (a) bytes buffered in the old stream at rotation
122
+ * time flush into `.log.1` after the rename — a crash between rename and
123
+ * flush loses at most one stream buffer; (b) another session holding the
124
+ * renamed `.log.1` writes into an anonymous inode whose bytes vanish on
125
+ * close — worst-case extra disk ≈ maxBytes × live sessions. A failed
126
+ * rotation rename (e.g. `.log.1` is a directory) sets `rotationDisabled` so
127
+ * appending cannot become a rename-retry storm per chunk; appending then
128
+ * grows unbounded, which is exactly the pre-rotation worst case.
129
+ *
130
+ * INVARIANT: all rotation fs ops (`statSync`/`renameSync`/`createWriteStream`)
131
+ * are SYNCHRONOUS and run inside `write`. PassThrough `data` events cannot
132
+ * interleave, and the `end` handler cannot fire mid-rotation; async fs here
133
+ * would reintroduce real races.
134
+ */
135
+ export function createStdioStderrSink(path, maxBytes = STDIO_LOG_MAX_BYTES) {
100
136
  let rotationDisabled = maxBytes <= 0;
101
137
  let file;
102
138
  // Byte tally for the currently open generation, reset to the just-opened
@@ -105,43 +141,52 @@ export function attachStdioStderrDrain(transport, serverName, logDir, maxBytes =
105
141
  // deliberately NOT counted: the cap governs captured server output, not
106
142
  // our bookkeeping lines.
107
143
  let tally = 0;
108
- const rotationActive = () => !rotationDisabled;
144
+ // Resolved when a generation's fd is closed (buffered bytes flushed).
145
+ let flushes = [];
146
+ const endStream = (stream) => {
147
+ flushes.push(new Promise((resolve) => { stream.once('close', () => resolve(undefined)); stream.end(); }));
148
+ };
109
149
  const open = () => {
110
- file = openLogFile(path, rotationActive() ? maxBytes : 0, (seed) => { tally = seed; });
150
+ file = openLogFile(path, rotationDisabled ? 0 : maxBytes, (seed) => { tally = seed; });
111
151
  };
112
- stream.on('data', (chunk) => {
113
- const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
114
- tail.push(bytes.toString('utf8'));
115
- if (file === undefined)
116
- open(); // lazy: a silent server leaves no file
117
- if (file === undefined)
118
- return;
119
- file.write(bytes);
120
- tally += bytes.length;
121
- if (!rotationDisabled && tally >= maxBytes) {
122
- let renamed = false;
123
- try {
124
- // Rename WHILE the old stream is open: POSIX keeps the open fd on the
125
- // inode, so buffered bytes flush into `.log.1` — no loss. The chunk
126
- // that crossed the boundary stays in the old file; never split it.
127
- renameSync(path, `${path}.1`);
128
- renamed = true;
129
- }
130
- catch {
131
- // Unrenamable backup path (EISDIR/EPERM/…): stop trying, or every
132
- // subsequent chunk retriggers the same doomed rename.
133
- rotationDisabled = true;
152
+ return {
153
+ write(chunk) {
154
+ const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
155
+ if (file === undefined)
156
+ open(); // lazy: a silent server leaves no file
157
+ if (file === undefined)
158
+ return;
159
+ file.write(bytes);
160
+ tally += bytes.length;
161
+ if (!rotationDisabled && tally >= maxBytes) {
162
+ let renamed = false;
163
+ try {
164
+ // Rename WHILE the old stream is open: POSIX keeps the open fd on the
165
+ // inode, so buffered bytes flush into `.log.1` — no loss. The chunk
166
+ // that crossed the boundary stays in the old file; never split it.
167
+ renameSync(path, `${path}.1`);
168
+ renamed = true;
169
+ }
170
+ catch {
171
+ // Unrenamable backup path (EISDIR/EPERM/…): stop trying, or every
172
+ // subsequent chunk retriggers the same doomed rename.
173
+ rotationDisabled = true;
174
+ }
175
+ if (renamed) {
176
+ endStream(file);
177
+ open();
178
+ }
134
179
  }
135
- if (renamed) {
136
- file.end();
137
- open();
138
- }
139
- }
140
- });
141
- // SDK close() does not destroy the PassThrough; the child's stderr `end`
142
- // does. Keep the data listener through SIGTERM grace so the last crash
143
- // line lands in both the ring and the file.
144
- stream.on('end', () => { file?.end(); file = undefined; });
180
+ },
181
+ close() {
182
+ if (file !== undefined)
183
+ endStream(file);
184
+ file = undefined;
185
+ const done = Promise.all(flushes);
186
+ flushes = [];
187
+ return done.then(() => undefined);
188
+ },
189
+ };
145
190
  }
146
191
  /**
147
192
  * Open (lazily) the generation log file: rotate an oversized existing file to
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-stderr.js","sourceRoot":"","sources":["../src/stdio-stderr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAoB,MAAM,SAAS,CAAA;AACxG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIzC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,CAAA;AAC5C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAA;AACxC,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAElD,MAAM,KAAK,GAAG,IAAI,OAAO,EAA0B,CAAA;AAEnD;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAEO;IADrB,MAAM,GAAG,EAAE,CAAA;IACnB,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAA;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,OAAO,SAAS,CAAC,MAAM,GAAG,oBAAoB;QAC5C,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,oBAAoB,CAAC;QAC1D,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,SAAoB;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAA+B,EAC/B,UAAkB,EAClB,MAAe,EACf,WAAmB,mBAAmB;IAEtC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;IAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAM;IACnD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,oBAAoB,CAAC,CAAA;IAClD,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,kBAAkB,EAAE,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,MAAM,CAAC,CAAA;IAC3C,IAAI,gBAAgB,GAAG,QAAQ,IAAI,CAAC,CAAA;IACpC,IAAI,IAA6B,CAAA;IACjC,yEAAyE;IACzE,mEAAmE;IACnE,kEAAkE;IAClE,wEAAwE;IACxE,yBAAyB;IACzB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,cAAc,GAAG,GAAY,EAAE,CAAC,CAAC,gBAAgB,CAAA;IACvD,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,CAAA,CAAC,CAAC,CAAC,CAAA;IACvF,CAAC,CAAA;IACD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACpE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QACjC,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,EAAE,CAAA,CAAC,uCAAuC;QACtE,IAAI,IAAI,KAAK,SAAS;YAAE,OAAM;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACjB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,gBAAgB,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3C,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,IAAI,CAAC;gBACH,sEAAsE;gBACtE,oEAAoE;gBACpE,mEAAmE;gBACnE,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAA;gBAC7B,OAAO,GAAG,IAAI,CAAA;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;gBAClE,sDAAsD;gBACtD,gBAAgB,GAAG,IAAI,CAAA;YACzB,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,GAAG,EAAE,CAAA;gBACV,IAAI,EAAE,CAAA;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IACF,yEAAyE;IACzE,uEAAuE;IACvE,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,SAAS,CAAA,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,SAAiC;IACpF,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,QAAQ,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAA;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;gBACvE,iEAAiE;YACnE,CAAC;QACH,CAAC;QACD,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAClD,uEAAuE;QACvE,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,kCAAkC;QAClC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAmD,CAAC,CAAC,CAAA;QAC3E,IAAI,CAAC,KAAK,CAAC,kBAAkB,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAC7E,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stdio-stderr.js","sourceRoot":"","sources":["../src/stdio-stderr.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-cc/mcp-client",
3
3
  "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools",
4
- "version": "0.8.2",
4
+ "version": "0.8.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/dsh-cc/dsh-cc.git",
@@ -25,15 +25,15 @@
25
25
  ],
26
26
  "license": "Apache-2.0",
27
27
  "peerDependencies": {
28
- "@deepseek-ai/dsh-credentials": ">=0.1.7-rc.2",
29
- "@deepseek-ai/dsh-invariants": ">=0.1.7-rc.2",
30
- "@deepseek-ai/dsh-llm": ">=0.1.7-rc.2",
31
- "@deepseek-ai/dsh-skill": ">=0.1.7-rc.2",
32
- "@deepseek-ai/dsh-subprocess": ">=0.1.7-rc.2",
33
- "@deepseek-ai/dsh-timeout": ">=0.1.7-rc.2",
34
- "@deepseek-ai/cordis": ">=0.1.7-rc.2",
28
+ "@deepseek-ai/dsh-credentials": ">=0.2.0-rc.2",
29
+ "@deepseek-ai/dsh-invariants": ">=0.2.0-rc.2",
30
+ "@deepseek-ai/dsh-llm": ">=0.2.0-rc.2",
31
+ "@deepseek-ai/dsh-skill": ">=0.2.0-rc.2",
32
+ "@deepseek-ai/dsh-subprocess": ">=0.2.0-rc.2",
33
+ "@deepseek-ai/dsh-timeout": ">=0.2.0-rc.2",
34
+ "@deepseek-ai/cordis": ">=0.2.0-rc.2",
35
35
  "@deepseek-ai/schemastery": "^3.18.1",
36
- "@dsh-cc/tools": "^0.8.2"
36
+ "@dsh-cc/tools": "^0.8.3"
37
37
  },
38
38
  "dependencies": {
39
39
  "@modelcontextprotocol/sdk": "1.29.0",
@@ -53,8 +53,8 @@
53
53
  "@deepseek-ai/schemastery": "link:../../../../deepseek-harness/vendor/schemastery",
54
54
  "@deepseek-ai/cordis-plugin-loader": "link:../../../../deepseek-harness/vendor/loader",
55
55
  "@deepseek-ai/dsh-system-prompt": "link:../../../../deepseek-harness/packages/core/system-prompt",
56
- "@dsh-cc/tools": "^0.8.2",
57
- "@dsh-cc/tool-search": "^0.8.2"
56
+ "@dsh-cc/tools": "^0.8.3",
57
+ "@dsh-cc/tool-search": "^0.8.3"
58
58
  },
59
59
  "publishConfig": {
60
60
  "access": "public"