@inbrowser/agent 0.2.0 → 0.3.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.
Files changed (61) hide show
  1. package/README.md +2 -2
  2. package/dist/cli/commands/run.js.map +1 -1
  3. package/dist/cli/fixtures.d.ts +2 -2
  4. package/dist/cli/fixtures.d.ts.map +1 -1
  5. package/dist/cli/fixtures.js +7 -16
  6. package/dist/cli/fixtures.js.map +1 -1
  7. package/dist/cli/llm/openrouter.d.ts +4 -4
  8. package/dist/cli/llm/openrouter.d.ts.map +1 -1
  9. package/dist/cli/llm/openrouter.js +20 -31
  10. package/dist/cli/llm/openrouter.js.map +1 -1
  11. package/dist/diagnostics/truthfulness.js.map +1 -1
  12. package/dist/eval/runner.d.ts +4 -4
  13. package/dist/eval/runner.d.ts.map +1 -1
  14. package/dist/eval/runner.js +1 -1
  15. package/dist/index.d.ts +8 -5
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/llm-adapter.d.ts +30 -34
  20. package/dist/llm-adapter.d.ts.map +1 -1
  21. package/dist/llm-adapter.js +61 -51
  22. package/dist/llm-adapter.js.map +1 -1
  23. package/dist/mcp/connect.d.ts +68 -0
  24. package/dist/mcp/connect.d.ts.map +1 -0
  25. package/dist/mcp/connect.js +111 -0
  26. package/dist/mcp/connect.js.map +1 -0
  27. package/dist/metrics.js +4 -4
  28. package/dist/metrics.js.map +1 -1
  29. package/dist/node.d.ts +2 -0
  30. package/dist/node.d.ts.map +1 -1
  31. package/dist/node.js +1 -0
  32. package/dist/node.js.map +1 -1
  33. package/dist/retrieval.d.ts +74 -0
  34. package/dist/retrieval.d.ts.map +1 -0
  35. package/dist/retrieval.js +287 -0
  36. package/dist/retrieval.js.map +1 -0
  37. package/dist/session.d.ts.map +1 -1
  38. package/dist/session.js +8 -2
  39. package/dist/session.js.map +1 -1
  40. package/dist/strategy.d.ts +2 -1
  41. package/dist/strategy.d.ts.map +1 -1
  42. package/dist/strategy.js +36 -26
  43. package/dist/strategy.js.map +1 -1
  44. package/dist/types/agent.d.ts +2 -3
  45. package/dist/types/agent.d.ts.map +1 -1
  46. package/dist/types/agent.js +1 -1
  47. package/dist/types/chat.d.ts +0 -15
  48. package/dist/types/chat.d.ts.map +1 -1
  49. package/dist/types/llm.d.ts +11 -64
  50. package/dist/types/llm.d.ts.map +1 -1
  51. package/dist/types/llm.js +7 -8
  52. package/dist/types/llm.js.map +1 -1
  53. package/dist/types/metrics.d.ts +2 -2
  54. package/dist/types/metrics.d.ts.map +1 -1
  55. package/dist/types/session.d.ts +2 -2
  56. package/dist/types/session.d.ts.map +1 -1
  57. package/dist/types/strategy.d.ts +13 -4
  58. package/dist/types/strategy.d.ts.map +1 -1
  59. package/dist/types/trace.d.ts +11 -9
  60. package/dist/types/trace.d.ts.map +1 -1
  61. package/package.json +3 -2
@@ -1,26 +1,22 @@
1
1
  /**
2
- * Adapter from the playground's existing `LlmProvider` shape to the
3
- * core `LlmClient` interface. Lets new core code (AgentSession,
4
- * AgentStrategy) consume providers via the narrow event-stream
5
- * surface without each provider needing a refactor.
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 existing `LlmProvider` is callback-based (`onText`,
8
- * `onToolCall`, etc.) and lives in the React host alongside its
9
- * BYOK forms + localStorage wiring. This file flips it into the
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
- * Each provider can later migrate to natively implement `LlmClient`
13
- * to drop this adapter. The plan calls this "slice 4 — one
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 { LlmClient } from './types/llm.js';
14
+ import type { ModelClient } from './types/llm.js';
18
15
  /**
19
- * Minimal external surface the adapter expects. Matches the shape
20
- * `examples/admin-compat-browser/src/llm.ts` exports. We re-declare
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 LegacyProviderUsage {
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 LegacyTurnDetails {
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 LegacyChatTurnResult {
36
+ export interface ProviderTurnResult {
41
37
  text?: string;
42
38
  thinking?: string;
43
39
  finishReason?: 'stop' | 'tool' | 'abort' | 'error';
44
- usage?: LegacyProviderUsage;
45
- details?: LegacyTurnDetails;
40
+ usage?: ProviderUsage;
41
+ details?: ProviderTurnDetails;
46
42
  }
47
- export interface LegacyChatCallbacks {
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 LegacyToolDecl {
54
+ export interface ProviderToolDecl {
59
55
  name: string;
60
56
  description: string;
61
57
  parameters: unknown;
62
58
  }
63
- export interface LegacyChatMessage {
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 LegacyProvider {
72
+ export interface CallbackProvider {
77
73
  readonly label: string;
78
74
  readonly supportsTools?: boolean;
79
- chatWithTools?(messages: LegacyChatMessage[], tools: LegacyToolDecl[], callbacks: LegacyChatCallbacks): Promise<LegacyChatTurnResult>;
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<LegacyChatTurnResult>;
78
+ }): Promise<ProviderTurnResult>;
83
79
  }
84
80
  /**
85
- * Wrap a legacy `LlmProvider` instance in the `LlmClient` shape.
81
+ * Wrap a `CallbackProvider` instance in the `ModelClient` shape.
86
82
  * The adapter:
87
83
  *
88
- * - Translates `ChatRequest` → legacy `chatWithTools` / `ask`
89
- * call.
84
+ * - Translates `ModelRequest` → `chatWithTools` / `ask` call.
90
85
  * - Buffers callback events into an async queue and replays them
91
- * as a `ChatEvent` `AsyncIterable`.
92
- * - Forwards the final usage + details as a `turn_complete`
93
- * event before closing the stream.
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 legacyProviderAsLlmClient(legacy: LegacyProvider, id: string): LlmClient;
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":"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"}
1
+ {"version":3,"file":"llm-adapter.d.ts","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,40 +1,37 @@
1
1
  /**
2
- * Adapter from the playground's existing `LlmProvider` shape to the
3
- * core `LlmClient` interface. Lets new core code (AgentSession,
4
- * AgentStrategy) consume providers via the narrow event-stream
5
- * surface without each provider needing a refactor.
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 existing `LlmProvider` is callback-based (`onText`,
8
- * `onToolCall`, etc.) and lives in the React host alongside its
9
- * BYOK forms + localStorage wiring. This file flips it into the
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
- * Each provider can later migrate to natively implement `LlmClient`
13
- * to drop this adapter. The plan calls this "slice 4 — one
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 legacy `LlmProvider` instance in the `LlmClient` shape.
15
+ * Wrap a `CallbackProvider` instance in the `ModelClient` shape.
19
16
  * The adapter:
20
17
  *
21
- * - Translates `ChatRequest` → legacy `chatWithTools` / `ask`
22
- * call.
18
+ * - Translates `ModelRequest` → `chatWithTools` / `ask` call.
23
19
  * - Buffers callback events into an async queue and replays them
24
- * as a `ChatEvent` `AsyncIterable`.
25
- * - Forwards the final usage + details as a `turn_complete`
26
- * event before closing the stream.
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 legacyProviderAsLlmClient(legacy, id) {
25
+ export function callbackProviderAsLlmClient(provider, id) {
29
26
  return {
30
27
  id,
31
- supportsTools: legacy.supportsTools ?? typeof legacy.chatWithTools === 'function',
28
+ supportsTools: provider.supportsTools ?? typeof provider.chatWithTools === 'function',
32
29
  chat(req, signal) {
33
- return drive(legacy, req, signal);
30
+ return drive(provider, req, signal);
34
31
  },
35
32
  };
36
33
  }
37
- async function* drive(legacy, req, signal) {
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 messagesLegacy = req.messages.map((m) => ({
60
+ const messages = req.messages.map((m) => ({
64
61
  role: m.role,
65
62
  text: m.text,
66
- ...(m.toolCalls ? { toolCalls: m.toolCalls } : {}),
67
- ...(m.callId ? { callId: m.callId } : {}),
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 toolsLegacy = req.tools.map((t) => ({
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 && legacy.chatWithTools) {
81
- result = await legacy.chatWithTools(messagesLegacy, toolsLegacy, callbacks);
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 = messagesLegacy
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 legacy.ask(prompt, callbacks.onText, { signal });
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
- if (result) {
116
- const rawUsage = {
117
- promptTokens: result.usage?.promptTokens ?? 0,
118
- completionTokens: result.usage?.outputTokens ?? 0,
119
- cachedTokens: result.usage?.cachedTokens,
120
- reasoningTokens: result.usage?.reasoningTokens,
121
- ...(typeof result.usage?.costUsd === 'number' ? { costUsd: result.usage.costUsd } : {}),
122
- };
123
- const details = {
124
- requestedModel: result.details?.requestedModel ?? '',
125
- ...(result.details?.servedModel ? { servedModel: result.details.servedModel } : {}),
126
- ...(result.details?.fingerprint ? { fingerprint: result.details.fingerprint } : {}),
127
- ...(result.details?.routing ? { routing: result.details.routing } : {}),
128
- };
129
- yield { kind: 'turn_complete', usage: rawUsage, details };
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
@@ -1 +1 @@
1
- {"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6EH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAA0B,EAAE,EAAU;IAChF,OAAO;QACL,EAAE;QACF,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,UAAU;QACrF,IAAI,CAAC,GAAiB,EAAE,MAAmB;YACzC,OAAO,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,KAAK,CACnB,QAA0B,EAC1B,GAAiB,EACjB,MAAmB;IAEnB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,QAAQ,GAAwB,IAAI,CAAC;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,SAAS,IAAI,CAAC,EAAc;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,QAAQ,EAAE,EAAE,CAAC;QACb,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,SAAS,MAAM;QACb,IAAI,GAAG,IAAI,CAAC;QACZ,QAAQ,EAAE,EAAE,CAAC;QACb,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAsB;QACnC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACtD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC9D,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,IAAI,CAAC;YACH,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,IAAI,CAAC,MAAM;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QACJ,MAAM;KACP,CAAC;IAEF,MAAM,QAAQ,GAA0B,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,CAAC,CAAC,CAAC,SAAS;YACb,CAAC,CAAC;gBACE,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClC,MAAM,EAAE,EAAE,CAAC,EAAE;oBACb,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD,CAAC,CAAC;aACJ;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAuB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;QACnC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU;KAClC,CAAC,CAAC,CAAC;IAEJ,IAAI,MAAsC,CAAC;IAC3C,IAAI,KAAc,CAAC;IACnB,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACjD,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,2DAA2D;gBAC3D,MAAM,MAAM,GAAG,QAAQ;qBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;qBACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;qBACxB,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChB,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBAC5B,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,CAAC;IAEb,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO;IACT,CAAC;IACD,6EAA6E;IAC7E,4EAA4E;IAC5E,+EAA+E;IAC/E,+EAA+E;IAC/E,sDAAsD;IACtD,6EAA6E;IAC7E,gFAAgF;IAChF,aAAa;IACb,MAAM,KAAK,GAAe;QACxB,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;QAC9C,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;QAC9C,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,SAAS;YAC3C,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,SAAS;YAC9C,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;YACnD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -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.completionTokens,
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.completionTokens,
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.completionTokens * row.output) / 1_000_000;
73
+ (rawUsage.outputTokens * row.output) / 1_000_000;
74
74
  return {
75
75
  tokensIn: rawUsage.promptTokens,
76
- tokensOut: rawUsage.completionTokens,
76
+ tokensOut: rawUsage.outputTokens,
77
77
  tokensCached,
78
78
  tokensReasoning,
79
79
  costUsd,
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
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
@@ -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"}