@inbrowser/agent 0.2.0 → 0.3.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.
- package/README.md +2 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/fixtures.d.ts +2 -2
- package/dist/cli/fixtures.d.ts.map +1 -1
- package/dist/cli/fixtures.js +7 -16
- package/dist/cli/fixtures.js.map +1 -1
- package/dist/cli/llm/openrouter.d.ts +4 -4
- package/dist/cli/llm/openrouter.d.ts.map +1 -1
- package/dist/cli/llm/openrouter.js +20 -31
- package/dist/cli/llm/openrouter.js.map +1 -1
- package/dist/diagnostics/truthfulness.js.map +1 -1
- package/dist/eval/runner.d.ts +4 -4
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/llm-adapter.d.ts +30 -34
- package/dist/llm-adapter.d.ts.map +1 -1
- package/dist/llm-adapter.js +61 -51
- package/dist/llm-adapter.js.map +1 -1
- package/dist/mcp/connect.d.ts +68 -0
- package/dist/mcp/connect.d.ts.map +1 -0
- package/dist/mcp/connect.js +111 -0
- package/dist/mcp/connect.js.map +1 -0
- package/dist/metrics.js +4 -4
- package/dist/metrics.js.map +1 -1
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -1
- package/dist/retrieval.d.ts +74 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +287 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +8 -2
- package/dist/session.js.map +1 -1
- package/dist/strategy.d.ts +2 -1
- package/dist/strategy.d.ts.map +1 -1
- package/dist/strategy.js +36 -26
- package/dist/strategy.js.map +1 -1
- package/dist/types/agent.d.ts +2 -3
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +1 -1
- package/dist/types/chat.d.ts +0 -15
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/llm.d.ts +11 -64
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/llm.js +7 -8
- package/dist/types/llm.js.map +1 -1
- package/dist/types/metrics.d.ts +2 -2
- package/dist/types/metrics.d.ts.map +1 -1
- package/dist/types/session.d.ts +2 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +13 -4
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/trace.d.ts +11 -9
- package/dist/types/trace.d.ts.map +1 -1
- package/package.json +5 -2
package/dist/llm-adapter.d.ts
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Adapter from
|
|
3
|
-
*
|
|
4
|
-
* AgentStrategy
|
|
5
|
-
*
|
|
2
|
+
* Adapter from a callback-style chat provider to the core
|
|
3
|
+
* `ModelClient` event-stream surface. Lets `AgentSession` /
|
|
4
|
+
* `AgentStrategy` consume providers that expose `onText`,
|
|
5
|
+
* `onToolCall`, etc. without each provider rewriting itself.
|
|
6
6
|
*
|
|
7
|
-
* The
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `AsyncIterable<ChatEvent>` shape the core wants.
|
|
7
|
+
* The callback shape is what the playground's BYOK forms +
|
|
8
|
+
* localStorage wiring already speak. This file flips it into the
|
|
9
|
+
* `AsyncIterable<ModelEvent>` shape the core wants.
|
|
11
10
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* provider at a time"; the adapter exists so slice 4 doesn't have
|
|
15
|
-
* to land atomically.
|
|
11
|
+
* A provider can later implement `ModelClient` natively and drop
|
|
12
|
+
* the adapter; nothing forces the indirection.
|
|
16
13
|
*/
|
|
17
|
-
import type {
|
|
14
|
+
import type { ModelClient } from './types/llm.js';
|
|
18
15
|
/**
|
|
19
|
-
* Minimal external surface the adapter expects.
|
|
20
|
-
*
|
|
21
|
-
* it here so `@inbrowser/agent` doesn't import from the playground.
|
|
16
|
+
* Minimal external surface the adapter expects. Re-declared here so
|
|
17
|
+
* `@inbrowser/agent` doesn't import from a downstream package.
|
|
22
18
|
*/
|
|
23
|
-
export interface
|
|
19
|
+
export interface ProviderUsage {
|
|
24
20
|
promptTokens?: number;
|
|
25
21
|
outputTokens?: number;
|
|
26
22
|
totalTokens?: number;
|
|
@@ -30,21 +26,21 @@ export interface LegacyProviderUsage {
|
|
|
30
26
|
reasoningTokens?: number;
|
|
31
27
|
isByok?: boolean;
|
|
32
28
|
}
|
|
33
|
-
export interface
|
|
29
|
+
export interface ProviderTurnDetails {
|
|
34
30
|
generationId?: string;
|
|
35
31
|
servedModel?: string;
|
|
36
32
|
requestedModel?: string;
|
|
37
33
|
fingerprint?: string;
|
|
38
34
|
routing?: Record<string, unknown>;
|
|
39
35
|
}
|
|
40
|
-
export interface
|
|
36
|
+
export interface ProviderTurnResult {
|
|
41
37
|
text?: string;
|
|
42
38
|
thinking?: string;
|
|
43
39
|
finishReason?: 'stop' | 'tool' | 'abort' | 'error';
|
|
44
|
-
usage?:
|
|
45
|
-
details?:
|
|
40
|
+
usage?: ProviderUsage;
|
|
41
|
+
details?: ProviderTurnDetails;
|
|
46
42
|
}
|
|
47
|
-
export interface
|
|
43
|
+
export interface ProviderCallbacks {
|
|
48
44
|
onText(chunk: string): void;
|
|
49
45
|
onThinking?(chunk: string): void;
|
|
50
46
|
onToolCall(call: {
|
|
@@ -55,12 +51,12 @@ export interface LegacyChatCallbacks {
|
|
|
55
51
|
}): void;
|
|
56
52
|
signal?: AbortSignal;
|
|
57
53
|
}
|
|
58
|
-
export interface
|
|
54
|
+
export interface ProviderToolDecl {
|
|
59
55
|
name: string;
|
|
60
56
|
description: string;
|
|
61
57
|
parameters: unknown;
|
|
62
58
|
}
|
|
63
|
-
export interface
|
|
59
|
+
export interface ProviderChatMessage {
|
|
64
60
|
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
65
61
|
text?: string;
|
|
66
62
|
toolCalls?: {
|
|
@@ -73,24 +69,24 @@ export interface LegacyChatMessage {
|
|
|
73
69
|
name?: string;
|
|
74
70
|
resultJson?: string;
|
|
75
71
|
}
|
|
76
|
-
export interface
|
|
72
|
+
export interface CallbackProvider {
|
|
77
73
|
readonly label: string;
|
|
78
74
|
readonly supportsTools?: boolean;
|
|
79
|
-
chatWithTools?(messages:
|
|
75
|
+
chatWithTools?(messages: ProviderChatMessage[], tools: ProviderToolDecl[], callbacks: ProviderCallbacks): Promise<ProviderTurnResult>;
|
|
80
76
|
ask(prompt: string, onChunk: (chunk: string) => void, options?: {
|
|
81
77
|
signal?: AbortSignal;
|
|
82
|
-
}): Promise<
|
|
78
|
+
}): Promise<ProviderTurnResult>;
|
|
83
79
|
}
|
|
84
80
|
/**
|
|
85
|
-
* Wrap a
|
|
81
|
+
* Wrap a `CallbackProvider` instance in the `ModelClient` shape.
|
|
86
82
|
* The adapter:
|
|
87
83
|
*
|
|
88
|
-
* - Translates `
|
|
89
|
-
* call.
|
|
84
|
+
* - Translates `ModelRequest` → `chatWithTools` / `ask` call.
|
|
90
85
|
* - Buffers callback events into an async queue and replays them
|
|
91
|
-
* as a `
|
|
92
|
-
* - Forwards the final usage
|
|
93
|
-
*
|
|
86
|
+
* as a `ModelEvent` `AsyncIterable`.
|
|
87
|
+
* - Forwards the final usage as a `usage` event before the iterable
|
|
88
|
+
* returns (the return itself signals turn completion — there is no
|
|
89
|
+
* separate terminal event).
|
|
94
90
|
*/
|
|
95
|
-
export declare function
|
|
91
|
+
export declare function callbackProviderAsLlmClient(provider: CallbackProvider, id: string): ModelClient;
|
|
96
92
|
//# sourceMappingURL=llm-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-adapter.d.ts","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"llm-adapter.d.ts","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/llm-adapter.js
CHANGED
|
@@ -1,40 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Adapter from
|
|
3
|
-
*
|
|
4
|
-
* AgentStrategy
|
|
5
|
-
*
|
|
2
|
+
* Adapter from a callback-style chat provider to the core
|
|
3
|
+
* `ModelClient` event-stream surface. Lets `AgentSession` /
|
|
4
|
+
* `AgentStrategy` consume providers that expose `onText`,
|
|
5
|
+
* `onToolCall`, etc. without each provider rewriting itself.
|
|
6
6
|
*
|
|
7
|
-
* The
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `AsyncIterable<ChatEvent>` shape the core wants.
|
|
7
|
+
* The callback shape is what the playground's BYOK forms +
|
|
8
|
+
* localStorage wiring already speak. This file flips it into the
|
|
9
|
+
* `AsyncIterable<ModelEvent>` shape the core wants.
|
|
11
10
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* provider at a time"; the adapter exists so slice 4 doesn't have
|
|
15
|
-
* to land atomically.
|
|
11
|
+
* A provider can later implement `ModelClient` natively and drop
|
|
12
|
+
* the adapter; nothing forces the indirection.
|
|
16
13
|
*/
|
|
17
14
|
/**
|
|
18
|
-
* Wrap a
|
|
15
|
+
* Wrap a `CallbackProvider` instance in the `ModelClient` shape.
|
|
19
16
|
* The adapter:
|
|
20
17
|
*
|
|
21
|
-
* - Translates `
|
|
22
|
-
* call.
|
|
18
|
+
* - Translates `ModelRequest` → `chatWithTools` / `ask` call.
|
|
23
19
|
* - Buffers callback events into an async queue and replays them
|
|
24
|
-
* as a `
|
|
25
|
-
* - Forwards the final usage
|
|
26
|
-
*
|
|
20
|
+
* as a `ModelEvent` `AsyncIterable`.
|
|
21
|
+
* - Forwards the final usage as a `usage` event before the iterable
|
|
22
|
+
* returns (the return itself signals turn completion — there is no
|
|
23
|
+
* separate terminal event).
|
|
27
24
|
*/
|
|
28
|
-
export function
|
|
25
|
+
export function callbackProviderAsLlmClient(provider, id) {
|
|
29
26
|
return {
|
|
30
27
|
id,
|
|
31
|
-
supportsTools:
|
|
28
|
+
supportsTools: provider.supportsTools ?? typeof provider.chatWithTools === 'function',
|
|
32
29
|
chat(req, signal) {
|
|
33
|
-
return drive(
|
|
30
|
+
return drive(provider, req, signal);
|
|
34
31
|
},
|
|
35
32
|
};
|
|
36
33
|
}
|
|
37
|
-
async function* drive(
|
|
34
|
+
async function* drive(provider, req, signal) {
|
|
38
35
|
const queue = [];
|
|
39
36
|
let resolver = null;
|
|
40
37
|
let done = false;
|
|
@@ -49,8 +46,8 @@ async function* drive(legacy, req, signal) {
|
|
|
49
46
|
resolver = null;
|
|
50
47
|
}
|
|
51
48
|
const callbacks = {
|
|
52
|
-
onText: (chunk) => push({ kind: 'text', chunk }),
|
|
53
|
-
onThinking: (chunk) => push({ kind: 'thinking', chunk }),
|
|
49
|
+
onText: (chunk) => push({ kind: 'text', text: chunk }),
|
|
50
|
+
onThinking: (chunk) => push({ kind: 'thinking', text: chunk }),
|
|
54
51
|
onToolCall: (call) => push({
|
|
55
52
|
kind: 'tool_call',
|
|
56
53
|
id: call.callId,
|
|
@@ -60,34 +57,43 @@ async function* drive(legacy, req, signal) {
|
|
|
60
57
|
}),
|
|
61
58
|
signal,
|
|
62
59
|
};
|
|
63
|
-
const
|
|
60
|
+
const messages = req.messages.map((m) => ({
|
|
64
61
|
role: m.role,
|
|
65
62
|
text: m.text,
|
|
66
|
-
...(m.toolCalls
|
|
67
|
-
|
|
63
|
+
...(m.toolCalls
|
|
64
|
+
? {
|
|
65
|
+
toolCalls: m.toolCalls.map((tc) => ({
|
|
66
|
+
callId: tc.id,
|
|
67
|
+
name: tc.name,
|
|
68
|
+
args: tc.args,
|
|
69
|
+
...(tc.signature ? { signature: tc.signature } : {}),
|
|
70
|
+
})),
|
|
71
|
+
}
|
|
72
|
+
: {}),
|
|
73
|
+
...(m.toolCallId ? { callId: m.toolCallId } : {}),
|
|
68
74
|
...(m.name ? { name: m.name } : {}),
|
|
69
75
|
...(m.resultJson !== undefined ? { resultJson: m.resultJson } : {}),
|
|
70
76
|
}));
|
|
71
|
-
const
|
|
72
|
-
name: t.name,
|
|
73
|
-
description: t.description,
|
|
74
|
-
parameters: t.parameters,
|
|
77
|
+
const tools = req.tools.map((t) => ({
|
|
78
|
+
name: t.function.name,
|
|
79
|
+
description: t.function.description,
|
|
80
|
+
parameters: t.function.parameters,
|
|
75
81
|
}));
|
|
76
82
|
let result;
|
|
77
83
|
let error;
|
|
78
84
|
const driver = (async () => {
|
|
79
85
|
try {
|
|
80
|
-
if (req.toolUseEnabled &&
|
|
81
|
-
result = await
|
|
86
|
+
if (req.toolUseEnabled && provider.chatWithTools) {
|
|
87
|
+
result = await provider.chatWithTools(messages, tools, callbacks);
|
|
82
88
|
}
|
|
83
89
|
else {
|
|
84
90
|
// Plain-chat path — flatten messages into a single prompt.
|
|
85
|
-
const prompt =
|
|
91
|
+
const prompt = messages
|
|
86
92
|
.filter((m) => m.role === 'user' || m.role === 'system')
|
|
87
93
|
.map((m) => m.text ?? '')
|
|
88
94
|
.filter(Boolean)
|
|
89
95
|
.join('\n\n');
|
|
90
|
-
result = await
|
|
96
|
+
result = await provider.ask(prompt, callbacks.onText, { signal });
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
catch (e) {
|
|
@@ -112,21 +118,25 @@ async function* drive(legacy, req, signal) {
|
|
|
112
118
|
yield { kind: 'error', message: error instanceof Error ? error.message : String(error) };
|
|
113
119
|
return;
|
|
114
120
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
121
|
+
// The turn completed without error. Emit final accounting as a `usage` event
|
|
122
|
+
// before returning, per the ModelClient contract (the return itself signals
|
|
123
|
+
// turn completion). A well-behaved provider returns usage; default to zeros if
|
|
124
|
+
// it did not, so the "usage before a normal return" guarantee always holds and
|
|
125
|
+
// the turn is never silently dropped by the consumer.
|
|
126
|
+
// Provider-reported `details` (servedModel/fingerprint/routing) is no longer
|
|
127
|
+
// carried on the stream — the session synthesizes `{ requestedModel }` from the
|
|
128
|
+
// client id.
|
|
129
|
+
const usage = {
|
|
130
|
+
promptTokens: result?.usage?.promptTokens ?? 0,
|
|
131
|
+
outputTokens: result?.usage?.outputTokens ?? 0,
|
|
132
|
+
...(result?.usage?.cachedTokens !== undefined
|
|
133
|
+
? { cachedTokens: result.usage.cachedTokens }
|
|
134
|
+
: {}),
|
|
135
|
+
...(result?.usage?.reasoningTokens !== undefined
|
|
136
|
+
? { reasoningTokens: result.usage.reasoningTokens }
|
|
137
|
+
: {}),
|
|
138
|
+
...(typeof result?.usage?.costUsd === 'number' ? { costUsd: result.usage.costUsd } : {}),
|
|
139
|
+
};
|
|
140
|
+
yield { kind: 'usage', usage };
|
|
131
141
|
}
|
|
132
142
|
//# sourceMappingURL=llm-adapter.js.map
|
package/dist/llm-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client adapter — the inverse of `./serve.ts`. Connects to an
|
|
3
|
+
* external MCP server, lists its tools, and adapts each into a
|
|
4
|
+
* {@link ToolHandler} the agent's registry/dispatch can run. This lets a
|
|
5
|
+
* session drive ANY MCP server's tools (pyric serve's `/__pyric/mcp`,
|
|
6
|
+
* Claude-Desktop-style servers, ...) over the same loop that runs
|
|
7
|
+
* in-process tools.
|
|
8
|
+
*
|
|
9
|
+
* Wire model (mirror of `serve.ts`): each MCP tool becomes one
|
|
10
|
+
* `ToolHandler` whose `parameters` is the tool's `inputSchema` (same
|
|
11
|
+
* `JsonSchema` shape, no translation) and whose `execute` forwards to
|
|
12
|
+
* `client.callTool`. The MCP `CallTool` result is mapped back into a
|
|
13
|
+
* `ToolResult` — and because `serve.ts` emits a tool's `ToolResult` as
|
|
14
|
+
* `JSON.stringify(result)` in a text block, a pyric-style server
|
|
15
|
+
* round-trips losslessly: we parse that text back into the structured
|
|
16
|
+
* result. Other servers' free-text results degrade to `{ ok, summary }`.
|
|
17
|
+
*
|
|
18
|
+
* Transports: streamable HTTP (a `url`) or stdio (a `command`). HTTP is
|
|
19
|
+
* the right one for a running `pyric serve --bridge` — connect straight
|
|
20
|
+
* to its `mcpUrl`; no stdio proxy needed (that shim exists only for
|
|
21
|
+
* Claude Code's static `.mcp.json`).
|
|
22
|
+
*/
|
|
23
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
24
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
25
|
+
import type { ToolHandler } from '../types/tools.js';
|
|
26
|
+
export type McpConnectOptions = (HttpTransportOptions | StdioTransportOptions | InjectedTransportOptions) & McpCommonOptions;
|
|
27
|
+
interface HttpTransportOptions {
|
|
28
|
+
/** Streamable-HTTP MCP endpoint (e.g. a running serve's `mcpUrl`). */
|
|
29
|
+
url: string | URL;
|
|
30
|
+
}
|
|
31
|
+
interface StdioTransportOptions {
|
|
32
|
+
/** Spawn an MCP server over stdio (e.g. `pyric`, `['mcp-proxy']`). */
|
|
33
|
+
command: string;
|
|
34
|
+
args?: string[];
|
|
35
|
+
env?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
interface InjectedTransportOptions {
|
|
38
|
+
/** Bring your own transport (tests, in-memory pairs, custom transports). */
|
|
39
|
+
transport: Transport;
|
|
40
|
+
}
|
|
41
|
+
interface McpCommonOptions {
|
|
42
|
+
/** Client identity in the MCP handshake. */
|
|
43
|
+
clientName?: string;
|
|
44
|
+
clientVersion?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Prefix every imported tool name (e.g. `'pyric_'`) to avoid clashes
|
|
47
|
+
* with in-process tools or a second MCP server. The prefix is stripped
|
|
48
|
+
* before the call is forwarded to the server.
|
|
49
|
+
*/
|
|
50
|
+
namePrefix?: string;
|
|
51
|
+
/** Keep only the named tools (after prefixing). Default: all. */
|
|
52
|
+
include?: (name: string) => boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface McpConnection {
|
|
55
|
+
/** The imported tools, ready to `registry.register(...)`. */
|
|
56
|
+
tools: ToolHandler[];
|
|
57
|
+
/** The live client (for advanced use — prompts, resources, ...). */
|
|
58
|
+
client: Client;
|
|
59
|
+
/** Disconnect the transport. Call when the session ends. */
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Connect to an MCP server and adapt its tools into `ToolHandler`s.
|
|
64
|
+
* Resolves once the handshake + `listTools` complete.
|
|
65
|
+
*/
|
|
66
|
+
export declare function connectMcpTools(opts: McpConnectOptions): Promise<McpConnection>;
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,OAAO,KAAK,EAAe,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE9E,MAAM,MAAM,iBAAiB,GAAG,CAC5B,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAC3B,GACC,gBAAgB,CAAC;AAEnB,UAAU,oBAAoB;IAC5B,sEAAsE;IACtE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB;AAED,UAAU,qBAAqB;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,UAAU,wBAAwB;IAChC,4EAA4E;IAC5E,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,gBAAgB;IACxB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAQD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBrF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client adapter — the inverse of `./serve.ts`. Connects to an
|
|
3
|
+
* external MCP server, lists its tools, and adapts each into a
|
|
4
|
+
* {@link ToolHandler} the agent's registry/dispatch can run. This lets a
|
|
5
|
+
* session drive ANY MCP server's tools (pyric serve's `/__pyric/mcp`,
|
|
6
|
+
* Claude-Desktop-style servers, ...) over the same loop that runs
|
|
7
|
+
* in-process tools.
|
|
8
|
+
*
|
|
9
|
+
* Wire model (mirror of `serve.ts`): each MCP tool becomes one
|
|
10
|
+
* `ToolHandler` whose `parameters` is the tool's `inputSchema` (same
|
|
11
|
+
* `JsonSchema` shape, no translation) and whose `execute` forwards to
|
|
12
|
+
* `client.callTool`. The MCP `CallTool` result is mapped back into a
|
|
13
|
+
* `ToolResult` — and because `serve.ts` emits a tool's `ToolResult` as
|
|
14
|
+
* `JSON.stringify(result)` in a text block, a pyric-style server
|
|
15
|
+
* round-trips losslessly: we parse that text back into the structured
|
|
16
|
+
* result. Other servers' free-text results degrade to `{ ok, summary }`.
|
|
17
|
+
*
|
|
18
|
+
* Transports: streamable HTTP (a `url`) or stdio (a `command`). HTTP is
|
|
19
|
+
* the right one for a running `pyric serve --bridge` — connect straight
|
|
20
|
+
* to its `mcpUrl`; no stdio proxy needed (that shim exists only for
|
|
21
|
+
* Claude Code's static `.mcp.json`).
|
|
22
|
+
*/
|
|
23
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
24
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
25
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
26
|
+
function makeTransport(opts) {
|
|
27
|
+
if ('transport' in opts)
|
|
28
|
+
return opts.transport;
|
|
29
|
+
if ('url' in opts)
|
|
30
|
+
return new StreamableHTTPClientTransport(new URL(opts.url));
|
|
31
|
+
return new StdioClientTransport({ command: opts.command, args: opts.args, env: opts.env });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Connect to an MCP server and adapt its tools into `ToolHandler`s.
|
|
35
|
+
* Resolves once the handshake + `listTools` complete.
|
|
36
|
+
*/
|
|
37
|
+
export async function connectMcpTools(opts) {
|
|
38
|
+
const client = new Client({ name: opts.clientName ?? 'inbrowser-agent', version: opts.clientVersion ?? '0.0.0' }, { capabilities: {} });
|
|
39
|
+
await client.connect(makeTransport(opts));
|
|
40
|
+
const { tools: listed } = await client.listTools();
|
|
41
|
+
const prefix = opts.namePrefix ?? '';
|
|
42
|
+
const tools = [];
|
|
43
|
+
for (const t of listed) {
|
|
44
|
+
const name = prefix + t.name;
|
|
45
|
+
if (opts.include && !opts.include(name))
|
|
46
|
+
continue;
|
|
47
|
+
tools.push(adaptTool(client, t.name, name, t.description ?? '', t.inputSchema));
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
tools,
|
|
51
|
+
client,
|
|
52
|
+
async close() {
|
|
53
|
+
await client.close();
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function adaptTool(client, remoteName, localName, description, parameters) {
|
|
58
|
+
return {
|
|
59
|
+
name: localName,
|
|
60
|
+
description,
|
|
61
|
+
parameters,
|
|
62
|
+
async execute(args, ctx) {
|
|
63
|
+
try {
|
|
64
|
+
const res = await client.callTool({ name: remoteName, arguments: (args ?? {}) }, undefined, { signal: ctx.signal });
|
|
65
|
+
return mapResult(res, localName);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return {
|
|
69
|
+
ok: false,
|
|
70
|
+
summary: `${localName}: ${err instanceof Error ? err.message : String(err)}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Map an MCP `CallTool` result back into a {@link ToolResult}. */
|
|
77
|
+
function mapResult(res, toolName) {
|
|
78
|
+
const r = res;
|
|
79
|
+
const text = (r.content ?? [])
|
|
80
|
+
.filter((c) => c?.type === 'text' && typeof c.text === 'string')
|
|
81
|
+
.map((c) => c.text)
|
|
82
|
+
.join('\n');
|
|
83
|
+
// A pyric-style server emits the tool's own `ToolResult` as JSON in the
|
|
84
|
+
// text block (see serve.ts) — round-trip it back to the structured shape.
|
|
85
|
+
if (text) {
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(text);
|
|
88
|
+
if (parsed &&
|
|
89
|
+
typeof parsed === 'object' &&
|
|
90
|
+
typeof parsed.ok === 'boolean' &&
|
|
91
|
+
typeof parsed.summary === 'string') {
|
|
92
|
+
return parsed;
|
|
93
|
+
}
|
|
94
|
+
// Valid JSON but not a ToolResult — keep it as structured data.
|
|
95
|
+
return { ok: !r.isError, summary: summarize(text), data: parsed };
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
/* not JSON — fall through to free-text */
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
ok: !r.isError,
|
|
103
|
+
summary: text ? summarize(text) : r.isError ? `${toolName} failed` : `${toolName} ok`,
|
|
104
|
+
...(text ? { data: { content: r.content } } : {}),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function summarize(text) {
|
|
108
|
+
const oneLine = text.replace(/\s+/g, ' ').trim();
|
|
109
|
+
return oneLine.length > 200 ? `${oneLine.slice(0, 197)}...` : oneLine;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics.js
CHANGED
|
@@ -43,7 +43,7 @@ export function computeTurnMetrics(input) {
|
|
|
43
43
|
if (typeof rawUsage.costUsd === 'number') {
|
|
44
44
|
return {
|
|
45
45
|
tokensIn: rawUsage.promptTokens,
|
|
46
|
-
tokensOut: rawUsage.
|
|
46
|
+
tokensOut: rawUsage.outputTokens,
|
|
47
47
|
tokensCached,
|
|
48
48
|
tokensReasoning,
|
|
49
49
|
costUsd: rawUsage.costUsd,
|
|
@@ -56,7 +56,7 @@ export function computeTurnMetrics(input) {
|
|
|
56
56
|
if (!row) {
|
|
57
57
|
return {
|
|
58
58
|
tokensIn: rawUsage.promptTokens,
|
|
59
|
-
tokensOut: rawUsage.
|
|
59
|
+
tokensOut: rawUsage.outputTokens,
|
|
60
60
|
tokensCached,
|
|
61
61
|
tokensReasoning,
|
|
62
62
|
costUsd: 0,
|
|
@@ -70,10 +70,10 @@ export function computeTurnMetrics(input) {
|
|
|
70
70
|
const billedInput = Math.max(0, rawUsage.promptTokens - tokensCached);
|
|
71
71
|
const costUsd = (billedInput * row.input) / 1_000_000 +
|
|
72
72
|
(tokensCached * row.cacheRead) / 1_000_000 +
|
|
73
|
-
(rawUsage.
|
|
73
|
+
(rawUsage.outputTokens * row.output) / 1_000_000;
|
|
74
74
|
return {
|
|
75
75
|
tokensIn: rawUsage.promptTokens,
|
|
76
|
-
tokensOut: rawUsage.
|
|
76
|
+
tokensOut: rawUsage.outputTokens,
|
|
77
77
|
tokensCached,
|
|
78
78
|
tokensReasoning,
|
|
79
79
|
costUsd,
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH;;;GAGG;AACH,MAAM,OAAO,GAA+B;IAC1C,+BAA+B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IAC/E,+BAA+B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;IAC9E,8BAA8B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE;IAC/E,gEAAgE;IAChE,6BAA6B;IAC7B,+BAA+B;CAChC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa;IACtD,OAAO,OAAO,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACjD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,IAAI,CAAC,CAAC;IACtD,0DAA0D;IAC1D,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE,QAAQ,CAAC,YAAY;YAC/B,SAAS,EAAE,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -20,4 +20,6 @@
|
|
|
20
20
|
export { openEventLog, defaultProjectLogDir } from './events/log.js';
|
|
21
21
|
export { generateEventId, buildRollbackEvent, HOST_AGENT_ID, EventTooLargeError, DEFAULT_MAX_EVENT_BYTES, } from './events/log-core.js';
|
|
22
22
|
export { FixtureLoadError, loadFixture, loadFixtures } from './eval/load-node.js';
|
|
23
|
+
export { connectMcpTools } from './mcp/connect.js';
|
|
24
|
+
export type { McpConnectOptions, McpConnection } from './mcp/connect.js';
|
|
23
25
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/node.js
CHANGED
|
@@ -20,4 +20,5 @@
|
|
|
20
20
|
export { openEventLog, defaultProjectLogDir } from './events/log.js';
|
|
21
21
|
export { generateEventId, buildRollbackEvent, HOST_AGENT_ID, EventTooLargeError, DEFAULT_MAX_EVENT_BYTES, } from './events/log-core.js';
|
|
22
22
|
export { FixtureLoadError, loadFixture, loadFixtures } from './eval/load-node.js';
|
|
23
|
+
export { connectMcpTools } from './mcp/connect.js';
|
|
23
24
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|