@ggui-ai/mcp-server 0.23.0 → 0.24.0
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/build-mcp.d.ts.map +1 -1
- package/dist/build-mcp.js +97 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/llm-backed-negotiator.d.ts +16 -1
- package/dist/llm-backed-negotiator.d.ts.map +1 -1
- package/dist/llm-backed-negotiator.js +4 -25
- package/package.json +13 -13
package/dist/build-mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-mcp.d.ts","sourceRoot":"","sources":["../src/build-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAK,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,iCAAiC,EACvC,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IACnD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,iCAAiC,CAAC;IAC3D;;;;;;;;;OASG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC5D;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAElE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;IAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"build-mcp.d.ts","sourceRoot":"","sources":["../src/build-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAK,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,iCAAiC,EACvC,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IACnD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,iCAAiC,CAAC;IAC3D;;;;;;;;;OASG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC5D;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAElE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;IAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;AA4MD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAChE,UAAU,EAAE,MAAM,cAAc,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,qBAA0B,GAC/B,SAAS,CAkQX"}
|
package/dist/build-mcp.js
CHANGED
|
@@ -99,6 +99,97 @@ function classifyFailurePayload(payload) {
|
|
|
99
99
|
...(typeof code === 'string' ? { code } : {}),
|
|
100
100
|
};
|
|
101
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Per-session fields on the `tool_invoked` line of the three session-keyed
|
|
104
|
+
* runtime tools (ggui#1377 for pull; ggui#1395 for consume and submit).
|
|
105
|
+
*
|
|
106
|
+
* In a composition that wires no logger into these handlers, this line is
|
|
107
|
+
* their whole trace. ggui#1376 had to be read per app and minute; these
|
|
108
|
+
* fields make it per session, from the wire shapes the handlers already
|
|
109
|
+
* return — ids, counts and flags, never gesture content. The return type is
|
|
110
|
+
* the closed key set that posture promises: a new key is a type change here,
|
|
111
|
+
* never a spread.
|
|
112
|
+
*
|
|
113
|
+
* What a `sessionId` on a SUCCESS line proves, per tool — never raw caller
|
|
114
|
+
* input in any of the three:
|
|
115
|
+
* - pull and consume: a session the caller's app owns. Both throw on an
|
|
116
|
+
* unknown or cross-app session before they return (the visibility gate),
|
|
117
|
+
* so every success line of theirs qualifies.
|
|
118
|
+
* - submit: a pipe this server holds. Only a `kind: 'dispatch'` that
|
|
119
|
+
* committed (`ok: true`) carries it — the append fails on an absent pipe
|
|
120
|
+
* and the handler answers `{ok: false, code}` (logged as `ok: false` +
|
|
121
|
+
* `code`, no session). The append checks existence, not app ownership,
|
|
122
|
+
* so the claim stops there. An audit kind (`openLink`,
|
|
123
|
+
* `requestDisplayMode`, an extension kind) touches no pipe and carries no
|
|
124
|
+
* session at all: its `sessionId` was never read by anything.
|
|
125
|
+
*
|
|
126
|
+
* Consume adds `eventCount`, `status`, `timeoutS` (the requested timeout; 0
|
|
127
|
+
* when omitted, the handler's own default) and `aborted: true` when the
|
|
128
|
+
* request's signal is aborted by the time the line is written — a superset
|
|
129
|
+
* of "cancelled mid-poll", read at log time, never a false negative. A
|
|
130
|
+
* committed dispatch adds `consumerPresent`, the doorbell's gate.
|
|
131
|
+
*/
|
|
132
|
+
const SESSION_TOOLS = new Set([
|
|
133
|
+
'ggui_runtime_pull',
|
|
134
|
+
'ggui_consume',
|
|
135
|
+
'ggui_runtime_submit_action',
|
|
136
|
+
]);
|
|
137
|
+
function sessionFields(tool, input, output, ctx) {
|
|
138
|
+
if (!SESSION_TOOLS.has(tool))
|
|
139
|
+
return {};
|
|
140
|
+
const sessionId = input['sessionId'];
|
|
141
|
+
if (typeof sessionId !== 'string')
|
|
142
|
+
return {};
|
|
143
|
+
if (tool === 'ggui_runtime_submit_action') {
|
|
144
|
+
if (input['kind'] !== 'dispatch')
|
|
145
|
+
return {};
|
|
146
|
+
if (output['ok'] !== true) {
|
|
147
|
+
return typeof output['code'] === 'string' ? { ok: false, code: output['code'] } : { ok: false };
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
sessionId,
|
|
151
|
+
...(typeof output['consumerPresent'] === 'boolean'
|
|
152
|
+
? { consumerPresent: output['consumerPresent'] }
|
|
153
|
+
: {}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
if (tool === 'ggui_consume') {
|
|
157
|
+
const events = output['events'];
|
|
158
|
+
return {
|
|
159
|
+
sessionId,
|
|
160
|
+
...(Array.isArray(events) ? { eventCount: events.length } : {}),
|
|
161
|
+
...(typeof output['status'] === 'string' ? { status: output['status'] } : {}),
|
|
162
|
+
timeoutS: typeof input['timeout'] === 'number' ? input['timeout'] : 0,
|
|
163
|
+
...(ctx.signal?.aborted === true ? { aborted: true } : {}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { sessionId };
|
|
167
|
+
}
|
|
168
|
+
/** Bound on `claimedSessionId`: a real id is a UUID; anything longer is not one. */
|
|
169
|
+
const CLAIMED_SESSION_ID_MAX_CHARS = 128;
|
|
170
|
+
/**
|
|
171
|
+
* The caller's CLAIMED session on an `outcome: 'error'` line of the same
|
|
172
|
+
* three tools (ggui#1395). A refused consume — unknown or cross-app
|
|
173
|
+
* session, the visibility gate — is the one failure of the tap → consume
|
|
174
|
+
* chain that is otherwise invisible per session. It is raw caller input,
|
|
175
|
+
* the first on this line: named as a claim so it never reads as an owned
|
|
176
|
+
* session, and cut to {@link CLAIMED_SESSION_ID_MAX_CHARS} with a flag so a
|
|
177
|
+
* caller cannot put arbitrary text in a log under a field that promises an
|
|
178
|
+
* id.
|
|
179
|
+
*/
|
|
180
|
+
function claimedSessionField(tool, input) {
|
|
181
|
+
if (!SESSION_TOOLS.has(tool))
|
|
182
|
+
return {};
|
|
183
|
+
const sessionId = input['sessionId'];
|
|
184
|
+
if (typeof sessionId !== 'string')
|
|
185
|
+
return {};
|
|
186
|
+
if (sessionId.length <= CLAIMED_SESSION_ID_MAX_CHARS)
|
|
187
|
+
return { claimedSessionId: sessionId };
|
|
188
|
+
return {
|
|
189
|
+
claimedSessionId: sessionId.slice(0, CLAIMED_SESSION_ID_MAX_CHARS),
|
|
190
|
+
claimedSessionIdTruncated: true,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
102
193
|
export function buildMcpServer(info, handlers, getContext, logger, opts = {}) {
|
|
103
194
|
const server = new McpServer({
|
|
104
195
|
name: info.name,
|
|
@@ -198,6 +289,10 @@ export function buildMcpServer(info, handlers, getContext, logger, opts = {}) {
|
|
|
198
289
|
tool: handler.name,
|
|
199
290
|
appId: ctx.appId,
|
|
200
291
|
...classifyFailurePayload(data.data),
|
|
292
|
+
// A HandlerFailure sits past the handler's own gates (consume's
|
|
293
|
+
// malformed-row refusal, ggui#839), so its session is owned and
|
|
294
|
+
// the per-session fields apply (ggui#1395).
|
|
295
|
+
...sessionFields(handler.name, input, validated, ctx),
|
|
201
296
|
elapsedMs: Date.now() - start,
|
|
202
297
|
});
|
|
203
298
|
return {
|
|
@@ -219,6 +314,7 @@ export function buildMcpServer(info, handlers, getContext, logger, opts = {}) {
|
|
|
219
314
|
tool: handler.name,
|
|
220
315
|
appId: ctx.appId,
|
|
221
316
|
outcome: 'success',
|
|
317
|
+
...sessionFields(handler.name, input, validated, ctx),
|
|
222
318
|
elapsedMs: Date.now() - start,
|
|
223
319
|
});
|
|
224
320
|
// When the handler's output carries a `nextStep`, lead the
|
|
@@ -278,6 +374,7 @@ export function buildMcpServer(info, handlers, getContext, logger, opts = {}) {
|
|
|
278
374
|
appId: ctx.appId,
|
|
279
375
|
outcome: 'error',
|
|
280
376
|
errorClass: errorClassName(err),
|
|
377
|
+
...claimedSessionField(handler.name, input),
|
|
281
378
|
elapsedMs: Date.now() - start,
|
|
282
379
|
});
|
|
283
380
|
throw err;
|
package/dist/index.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export type { GenerationDeps } from '@ggui-ai/mcp-server-handlers';
|
|
|
31
31
|
export { buildNoCredentialsGguiSession } from '@ggui-ai/mcp-server-handlers';
|
|
32
32
|
export { buildOpsBundleHandlers, createGguiServer, defaultHandlers } from './server.js';
|
|
33
33
|
export type { CreateGguiServerOptions, ErrorMapperResult, GguiServer, OpsBundleDeps, } from './server.js';
|
|
34
|
+
export { AnthropicStructuredCallError, buildLlmCaller } from './llm-backed-negotiator.js';
|
|
35
|
+
export type { AnthropicStructuredCallFailureKind, BuildLlmCallerOptions, } from './llm-backed-negotiator.js';
|
|
34
36
|
export { buildControlService, CONTROL_PATH, filterHandlersByAudience, SINGLE_CALL_OPS, } from './control-service.js';
|
|
35
37
|
export type { AudienceTag, BuildControlServiceArgs } from './control-service.js';
|
|
36
38
|
export { computeRuntimeBundleHash, insertRuntimeBundleHash, resolveHashedRuntimeBundleUrl, resolveRuntimeBundleHash, } from './runtime-bundle-hash.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKlF,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,11 @@
|
|
|
31
31
|
// dependency.
|
|
32
32
|
export { buildNoCredentialsGguiSession } from '@ggui-ai/mcp-server-handlers';
|
|
33
33
|
export { buildOpsBundleHandlers, createGguiServer, defaultHandlers } from './server.js';
|
|
34
|
+
// The handshake negotiator's LLM caller (the rerank judge + the contract
|
|
35
|
+
// synthesizer). Exported so a deployment that builds its own negotiator
|
|
36
|
+
// reuses this one Anthropic structured-call implementation — and can bound
|
|
37
|
+
// it with an abort signal — instead of carrying a copy.
|
|
38
|
+
export { AnthropicStructuredCallError, buildLlmCaller } from './llm-backed-negotiator.js';
|
|
34
39
|
// Control plane (`/control`) — the composition that projects every
|
|
35
40
|
// `protocol`- and `ops`-tagged handler onto one anonymous-capable
|
|
36
41
|
// route with per-tool auth + confirmation gates. `createGguiServer`
|
|
@@ -64,7 +64,22 @@ import type { Blueprint } from "@ggui-ai/protocol";
|
|
|
64
64
|
* - `@ggui-ai/negotiator/synthesize-contract` (cold-path contract
|
|
65
65
|
* synthesizer)
|
|
66
66
|
*/
|
|
67
|
-
export
|
|
67
|
+
export interface BuildLlmCallerOptions {
|
|
68
|
+
/**
|
|
69
|
+
* Aborts every request this caller makes — both `call` (through the
|
|
70
|
+
* provider adapter) and `callStructured` (the direct `/v1/messages`
|
|
71
|
+
* request). A caller that bounds the call's wall-clock time passes a
|
|
72
|
+
* timed signal here so the bound cancels the request itself rather than
|
|
73
|
+
* racing it. Absent ⇒ the requests run unbounded, as before.
|
|
74
|
+
*
|
|
75
|
+
* The signal is bound for this caller's lifetime and shared by every
|
|
76
|
+
* request it makes: once it fires, every later request on this caller
|
|
77
|
+
* rejects at once. A caller that bounds each call builds one caller per
|
|
78
|
+
* bound, never caches one with a timed signal.
|
|
79
|
+
*/
|
|
80
|
+
readonly signal?: AbortSignal;
|
|
81
|
+
}
|
|
82
|
+
export declare function buildLlmCaller(selection: LlmSelection, providerKey: ProviderKeyRef, options?: BuildLlmCallerOptions): LLMCaller;
|
|
68
83
|
/**
|
|
69
84
|
* Thinking budget added to the caller's ANSWER budget when the model
|
|
70
85
|
* refuses a forced tool. Those are the always-thinking models: their
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-backed-negotiator.d.ts","sourceRoot":"","sources":["../src/llm-backed-negotiator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAEjB,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"llm-backed-negotiator.d.ts","sourceRoot":"","sources":["../src/llm-backed-negotiator.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,31 +38,7 @@
|
|
|
38
38
|
import { decideHandshake, } from "@ggui-ai/mcp-server-handlers/renders";
|
|
39
39
|
import { anthropicRejectsForcedToolChoice, isRecord } from "@ggui-ai/protocol";
|
|
40
40
|
import { selectAdapter } from "@ggui-ai/ui-gen/providers";
|
|
41
|
-
|
|
42
|
-
* Wrap a resolved BYOK credential pair into an `LLMCaller` the
|
|
43
|
-
* negotiator can call. The adapter is chosen via `selectAdapter`
|
|
44
|
-
* (anthropic / openai / google / openrouter / bedrock). `call` runs
|
|
45
|
-
* one `complete()` round-trip on the underlying adapter.
|
|
46
|
-
*
|
|
47
|
-
* `callStructured` is wired for Anthropic only. Anthropic's
|
|
48
|
-
* `/v1/messages` natively supports forced tool use via `tools[] +
|
|
49
|
-
* tool_choice: {type:'tool', name}` — on the models that accept it; the
|
|
50
|
-
* always-thinking models refuse a forced tool (see
|
|
51
|
-
* `anthropicCallStructured`) — so we hit the API directly here
|
|
52
|
-
* instead of expanding the `ProviderAdapter` interface for one
|
|
53
|
-
* provider. Other providers (OpenAI, Google, OpenRouter, Bedrock)
|
|
54
|
-
* omit `callStructured`; consumers detect absence and fall back to
|
|
55
|
-
* regex-JSON extraction on the text path. When this story shifts —
|
|
56
|
-
* e.g., we want OpenAI tool use too — promote `completeWithTool`
|
|
57
|
-
* onto `ProviderAdapter` as an optional method and wire each
|
|
58
|
-
* adapter; this in-place implementation stays the bridge until then.
|
|
59
|
-
*
|
|
60
|
-
* Used by:
|
|
61
|
-
* - `@ggui-ai/negotiator/llm-rerank` (Tier 2 RAG match judge)
|
|
62
|
-
* - `@ggui-ai/negotiator/synthesize-contract` (cold-path contract
|
|
63
|
-
* synthesizer)
|
|
64
|
-
*/
|
|
65
|
-
export function buildLlmCaller(selection, providerKey) {
|
|
41
|
+
export function buildLlmCaller(selection, providerKey, options = {}) {
|
|
66
42
|
const adapter = selectAdapter(selection.provider);
|
|
67
43
|
const isAnthropic = selection.provider === "anthropic";
|
|
68
44
|
// `selection` IS an `LlmRoute & {inference params}` — the typed
|
|
@@ -84,6 +60,7 @@ export function buildLlmCaller(selection, providerKey) {
|
|
|
84
60
|
systemPrompt,
|
|
85
61
|
userPrompt: userMessage,
|
|
86
62
|
...(maxTokens !== undefined ? { maxTokens } : {}),
|
|
63
|
+
...(options.signal !== undefined ? { signal: options.signal } : {}),
|
|
87
64
|
});
|
|
88
65
|
if (!result.ok) {
|
|
89
66
|
throw new Error(`[llm-backed-negotiator] ${selection.provider} ${selection.model} ` +
|
|
@@ -101,6 +78,7 @@ export function buildLlmCaller(selection, providerKey) {
|
|
|
101
78
|
userMessage,
|
|
102
79
|
tool,
|
|
103
80
|
maxTokens,
|
|
81
|
+
...(options.signal !== undefined ? { signal: options.signal } : {}),
|
|
104
82
|
});
|
|
105
83
|
return result;
|
|
106
84
|
};
|
|
@@ -197,6 +175,7 @@ async function anthropicCallStructured(args) {
|
|
|
197
175
|
"content-type": "application/json",
|
|
198
176
|
},
|
|
199
177
|
body: JSON.stringify(body),
|
|
178
|
+
...(args.signal !== undefined ? { signal: args.signal } : {}),
|
|
200
179
|
});
|
|
201
180
|
if (!response.ok) {
|
|
202
181
|
const text = await response.text().catch(() => "");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ggui-ai/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "Self-hosted MCP server for the ggui protocol. An HTTP/MCP binding layer over @ggui-ai/mcp-server-handlers and the reference adapters from @ggui-ai/mcp-server-core — run it via `ggui serve`.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ggui",
|
|
@@ -32,17 +32,17 @@
|
|
|
32
32
|
"resend": "^6.12.2",
|
|
33
33
|
"ws": "^8.20.1",
|
|
34
34
|
"zod": "^4.3.6",
|
|
35
|
-
"@ggui-ai/console": "0.
|
|
36
|
-
"@ggui-ai/design": "0.
|
|
37
|
-
"@ggui-ai/iframe-runtime": "0.
|
|
38
|
-
"@ggui-ai/mcp-server-core": "0.
|
|
39
|
-
"@ggui-ai/mcp-server-handlers": "0.
|
|
40
|
-
"@ggui-ai/negotiator": "0.
|
|
41
|
-
"@ggui-ai/preview-a2ui": "0.
|
|
42
|
-
"@ggui-ai/project-config": "0.
|
|
43
|
-
"@ggui-ai/protocol": "0.
|
|
44
|
-
"@ggui-ai/ui-gen": "0.
|
|
45
|
-
"@ggui-ai/ui-registry": "0.
|
|
35
|
+
"@ggui-ai/console": "0.24.0",
|
|
36
|
+
"@ggui-ai/design": "0.24.0",
|
|
37
|
+
"@ggui-ai/iframe-runtime": "0.24.0",
|
|
38
|
+
"@ggui-ai/mcp-server-core": "0.24.0",
|
|
39
|
+
"@ggui-ai/mcp-server-handlers": "0.24.0",
|
|
40
|
+
"@ggui-ai/negotiator": "0.24.0",
|
|
41
|
+
"@ggui-ai/preview-a2ui": "0.24.0",
|
|
42
|
+
"@ggui-ai/project-config": "0.24.0",
|
|
43
|
+
"@ggui-ai/protocol": "0.24.0",
|
|
44
|
+
"@ggui-ai/ui-gen": "0.24.0",
|
|
45
|
+
"@ggui-ai/ui-registry": "0.24.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/express": "^5.0.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@types/ws": "^8.5.10",
|
|
52
52
|
"typescript": "^5.0.0",
|
|
53
53
|
"vitest": "^3.2.6",
|
|
54
|
-
"@ggui-ai/protocol-conformance": "0.
|
|
54
|
+
"@ggui-ai/protocol-conformance": "0.24.0"
|
|
55
55
|
},
|
|
56
56
|
"repository": {
|
|
57
57
|
"type": "git",
|