foundr-companion 0.1.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 (75) hide show
  1. package/dist/bridge/adapters.d.mts +33 -0
  2. package/dist/bridge/adapters.d.mts.map +1 -0
  3. package/dist/bridge/adapters.mjs +159 -0
  4. package/dist/bridge/adapters.mjs.map +1 -0
  5. package/dist/bridge/bridge-auth.d.mts +5 -0
  6. package/dist/bridge/bridge-auth.d.mts.map +1 -0
  7. package/dist/bridge/bridge-auth.mjs +24 -0
  8. package/dist/bridge/bridge-auth.mjs.map +1 -0
  9. package/dist/bridge/codex-app-server-adapter.d.mts +37 -0
  10. package/dist/bridge/codex-app-server-adapter.d.mts.map +1 -0
  11. package/dist/bridge/codex-app-server-adapter.mjs +401 -0
  12. package/dist/bridge/codex-app-server-adapter.mjs.map +1 -0
  13. package/dist/bridge/daemon.mjs +190 -0
  14. package/dist/bridge/foundr-codex-reply.d.mts +96 -0
  15. package/dist/bridge/foundr-codex-reply.d.mts.map +1 -0
  16. package/dist/bridge/foundr-codex-reply.mjs +542 -0
  17. package/dist/bridge/foundr-codex-reply.mjs.map +1 -0
  18. package/dist/bridge/listener-flags.d.mts +5 -0
  19. package/dist/bridge/listener-flags.d.mts.map +1 -0
  20. package/dist/bridge/listener-flags.mjs +18 -0
  21. package/dist/bridge/listener-flags.mjs.map +1 -0
  22. package/dist/bridge/listener-loop.d.mts +58 -0
  23. package/dist/bridge/listener-loop.d.mts.map +1 -0
  24. package/dist/bridge/listener-loop.mjs +424 -0
  25. package/dist/bridge/listener-loop.mjs.map +1 -0
  26. package/dist/bridge/logout.d.mts +8 -0
  27. package/dist/bridge/logout.d.mts.map +1 -0
  28. package/dist/bridge/logout.mjs +35 -0
  29. package/dist/bridge/logout.mjs.map +1 -0
  30. package/dist/bridge/mcp-client.d.mts +97 -0
  31. package/dist/bridge/mcp-client.d.mts.map +1 -0
  32. package/dist/bridge/mcp-client.mjs +290 -0
  33. package/dist/bridge/mcp-client.mjs.map +1 -0
  34. package/dist/bridge/oauth-provider.d.mts +32 -0
  35. package/dist/bridge/oauth-provider.d.mts.map +1 -0
  36. package/dist/bridge/oauth-provider.mjs +94 -0
  37. package/dist/bridge/oauth-provider.mjs.map +1 -0
  38. package/dist/bridge/public-room-mention-listener-loop.d.mts +120 -0
  39. package/dist/bridge/public-room-mention-listener-loop.d.mts.map +1 -0
  40. package/dist/bridge/public-room-mention-listener-loop.mjs +225 -0
  41. package/dist/bridge/public-room-mention-listener-loop.mjs.map +1 -0
  42. package/dist/bridge/realtime-wake.d.mts +11 -0
  43. package/dist/bridge/realtime-wake.d.mts.map +1 -0
  44. package/dist/bridge/realtime-wake.mjs +134 -0
  45. package/dist/bridge/realtime-wake.mjs.map +1 -0
  46. package/dist/bridge/work-mission-listener-loop.d.mts +100 -0
  47. package/dist/bridge/work-mission-listener-loop.d.mts.map +1 -0
  48. package/dist/bridge/work-mission-listener-loop.mjs +737 -0
  49. package/dist/bridge/work-mission-listener-loop.mjs.map +1 -0
  50. package/dist/cli-parse.d.ts +27 -0
  51. package/dist/cli-parse.d.ts.map +1 -0
  52. package/dist/cli-parse.js +47 -0
  53. package/dist/cli-parse.js.map +1 -0
  54. package/dist/cli.d.ts +3 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +232 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/codex-preflight.d.ts +44 -0
  59. package/dist/codex-preflight.d.ts.map +1 -0
  60. package/dist/codex-preflight.js +74 -0
  61. package/dist/codex-preflight.js.map +1 -0
  62. package/dist/index.d.ts +5 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +5 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/launchd.d.ts +78 -0
  67. package/dist/launchd.d.ts.map +1 -0
  68. package/dist/launchd.js +118 -0
  69. package/dist/launchd.js.map +1 -0
  70. package/dist/paths.d.ts +30 -0
  71. package/dist/paths.d.ts.map +1 -0
  72. package/dist/paths.js +26 -0
  73. package/dist/paths.js.map +1 -0
  74. package/install.sh +117 -0
  75. package/package.json +29 -0
@@ -0,0 +1,424 @@
1
+ import { createPrivateChatWakeSubscription } from './realtime-wake.mjs'
2
+
3
+ const CLIENT_NAME = 'foundr-local-bridge'
4
+ const CLIENT_VERSION = '0.1.0'
5
+ const HEARTBEAT_INTERVAL_MS = 20_000
6
+ const FALLBACK_POLL_INTERVAL_MS = 60_000
7
+ const WAKE_FALLBACK_POLL_INTERVAL_MS = 15_000
8
+ const PROGRESS_FLUSH_INTERVAL_MS = 120
9
+ const PROGRESS_MAX_BUFFER_CHARS = 180
10
+ const FINAL_PROGRESS_FLUSH_TIMEOUT_MS = 150
11
+
12
+ function nowMs() {
13
+ return performance.now()
14
+ }
15
+
16
+ function timingEnabled() {
17
+ return process.env.FOUNDR_PRIVATE_CHAT_TIMING === '1'
18
+ }
19
+
20
+ function timingLog(startedAt, message) {
21
+ if (!timingEnabled()) return
22
+ console.error(`[foundr:listen:timing +${Math.round(nowMs() - startedAt)}ms] ${message}`)
23
+ }
24
+
25
+ function replyText(reply) {
26
+ return String(reply?.text ?? '').trim()
27
+ }
28
+
29
+ function boundedError(error) {
30
+ const message = error instanceof Error ? error.message : String(error)
31
+ return message.slice(0, 500)
32
+ }
33
+
34
+ function delay(ms) {
35
+ return new Promise((resolve) => {
36
+ const timer = setTimeout(resolve, ms)
37
+ timer.unref?.()
38
+ })
39
+ }
40
+
41
+ function isFatalToolError(error) {
42
+ const message = error instanceof Error ? error.message : String(error)
43
+ return /\b(AUTH_REQUIRED|AUTH_INVALID|AUTH_REVOKED|UNAUTHORIZED|SESSION_EXPIRED)\b/i.test(message)
44
+ }
45
+
46
+ function progressNumberFromEnv(name, fallback) {
47
+ const value = Number(process.env[name])
48
+ return Number.isFinite(value) && value > 0 ? value : fallback
49
+ }
50
+
51
+ function wakeFallbackPollMs(fallbackPollMs) {
52
+ const configured = Number(process.env.FOUNDR_PRIVATE_CHAT_WAKE_FALLBACK_POLL_MS)
53
+ if (Number.isFinite(configured) && configured > 0) return configured
54
+ return Math.max(fallbackPollMs, WAKE_FALLBACK_POLL_INTERVAL_MS)
55
+ }
56
+
57
+ function createProgressReporter({ client, deliveryId, sessionId, iterationStartedAt }) {
58
+ const flushIntervalMs = progressNumberFromEnv('FOUNDR_PRIVATE_CHAT_PROGRESS_FLUSH_MS', PROGRESS_FLUSH_INTERVAL_MS)
59
+ const maxBufferChars = progressNumberFromEnv('FOUNDR_PRIVATE_CHAT_PROGRESS_MAX_CHARS', PROGRESS_MAX_BUFFER_CHARS)
60
+ const finalFlushTimeoutMs = progressNumberFromEnv(
61
+ 'FOUNDR_PRIVATE_CHAT_FINAL_PROGRESS_TIMEOUT_MS',
62
+ FINAL_PROGRESS_FLUSH_TIMEOUT_MS,
63
+ )
64
+
65
+ let bufferedText = ''
66
+ let pendingStatus = null
67
+ let pendingError = null
68
+ let flushTimer = null
69
+ let sawFirstDelta = false
70
+ let progressChain = Promise.resolve()
71
+
72
+ const clearFlushTimer = () => {
73
+ if (!flushTimer) return
74
+ clearTimeout(flushTimer)
75
+ flushTimer = null
76
+ }
77
+
78
+ const callProgressTool = (args) => {
79
+ progressChain = progressChain
80
+ .then(() => client.callTool('stream_private_chat_reply', {
81
+ delivery_id: deliveryId,
82
+ listener_session_id: sessionId,
83
+ ...args,
84
+ }))
85
+ .catch(() => {})
86
+ return progressChain
87
+ }
88
+
89
+ const flush = () => {
90
+ clearFlushTimer()
91
+ const textDelta = bufferedText
92
+ const status = pendingStatus
93
+ const error = pendingError
94
+ bufferedText = ''
95
+ pendingStatus = null
96
+ pendingError = null
97
+
98
+ if (!textDelta && !status && !error) return progressChain
99
+ const nextStatus = textDelta && status !== 'failed' ? 'writing' : status
100
+
101
+ return callProgressTool({
102
+ ...(textDelta ? { text_delta: textDelta } : {}),
103
+ ...(nextStatus ? { status: nextStatus } : {}),
104
+ ...(error ? { error } : {}),
105
+ })
106
+ }
107
+
108
+ const scheduleFlush = () => {
109
+ if (flushTimer) return
110
+ flushTimer = setTimeout(() => {
111
+ flushTimer = null
112
+ void flush()
113
+ }, flushIntervalMs)
114
+ flushTimer.unref?.()
115
+ }
116
+
117
+ return {
118
+ push(event) {
119
+ if (event.type === 'status') {
120
+ // Claiming the delivery already moves the visible state to thinking.
121
+ if (event.status === 'thinking') return
122
+ pendingStatus = event.status
123
+ if (event.status === 'failed') {
124
+ void flush()
125
+ return
126
+ }
127
+ scheduleFlush()
128
+ return
129
+ }
130
+
131
+ if (event.type !== 'delta' || !event.text) return
132
+ if (!sawFirstDelta) {
133
+ sawFirstDelta = true
134
+ timingLog(iterationStartedAt, `first delta delivery=${deliveryId}`)
135
+ }
136
+ bufferedText += event.text
137
+ pendingStatus = 'writing'
138
+ if (bufferedText.length >= maxBufferChars) {
139
+ void flush()
140
+ } else {
141
+ scheduleFlush()
142
+ }
143
+ },
144
+
145
+ async flushBeforeFinal() {
146
+ const flushed = flush()
147
+ await Promise.race([flushed, delay(finalFlushTimeoutMs)])
148
+ },
149
+
150
+ async fail(error) {
151
+ pendingStatus = 'failed'
152
+ pendingError = boundedError(error)
153
+ await flush()
154
+ },
155
+
156
+ cancel() {
157
+ clearFlushTimer()
158
+ bufferedText = ''
159
+ pendingStatus = null
160
+ pendingError = null
161
+ },
162
+ }
163
+ }
164
+
165
+ export async function runOnePrivateChatIteration({
166
+ client,
167
+ adapter,
168
+ sessionId,
169
+ claimTool = 'wait_for_private_chat_message',
170
+ }) {
171
+ const iterationStartedAt = nowMs()
172
+ const inbound = claimTool === 'claim_private_chat_message'
173
+ ? await client.callTool('claim_private_chat_message', {
174
+ listener_session_id: sessionId,
175
+ })
176
+ : await client.callTool('wait_for_private_chat_message', {
177
+ timeout_seconds: 25,
178
+ listener_session_id: sessionId,
179
+ })
180
+
181
+ if (inbound.timed_out) {
182
+ return { timed_out: true }
183
+ }
184
+ timingLog(iterationStartedAt, `claimed delivery=${inbound.delivery?.id ?? 'unknown'} via ${claimTool}`)
185
+
186
+ let text
187
+ const progress = createProgressReporter({
188
+ client,
189
+ deliveryId: inbound.delivery.id,
190
+ sessionId,
191
+ iterationStartedAt,
192
+ })
193
+
194
+ try {
195
+ text = replyText(await adapter.reply(inbound, {
196
+ onProgress: (event) => {
197
+ progress.push(event)
198
+ },
199
+ }))
200
+ await progress.flushBeforeFinal()
201
+ timingLog(iterationStartedAt, `adapter completed delivery=${inbound.delivery?.id ?? 'unknown'}`)
202
+ } catch (error) {
203
+ const errorText = boundedError(error)
204
+ await progress.fail(errorText).catch(() => {})
205
+ await client.callTool('ack_private_chat_message', {
206
+ delivery_id: inbound.delivery.id,
207
+ listener_session_id: sessionId,
208
+ status: 'failed',
209
+ error: errorText,
210
+ })
211
+ return { failed: true, error: errorText }
212
+ }
213
+
214
+ if (!text) {
215
+ await client.callTool('ack_private_chat_message', {
216
+ delivery_id: inbound.delivery.id,
217
+ listener_session_id: sessionId,
218
+ status: 'skipped',
219
+ })
220
+ return { skipped: true }
221
+ }
222
+
223
+ try {
224
+ const sent = await client.callTool('send_private_chat_message', {
225
+ text,
226
+ delivery_id: inbound.delivery.id,
227
+ })
228
+ const responseMessageId = sent.message.id
229
+ timingLog(iterationStartedAt, `reply sent delivery=${inbound.delivery?.id ?? 'unknown'}`)
230
+ try {
231
+ await client.callTool('ack_private_chat_message', {
232
+ delivery_id: inbound.delivery.id,
233
+ listener_session_id: sessionId,
234
+ status: 'replied',
235
+ response_message_id: responseMessageId,
236
+ })
237
+ } catch (error) {
238
+ return { replied: true, ack_failed: true, message_id: responseMessageId, error: boundedError(error) }
239
+ }
240
+ timingLog(iterationStartedAt, `ack sent delivery=${inbound.delivery?.id ?? 'unknown'}`)
241
+ return { replied: true, message_id: responseMessageId }
242
+ } catch (error) {
243
+ progress.cancel()
244
+ if (isFatalToolError(error)) throw error
245
+ const errorText = boundedError(error)
246
+ await client.callTool('ack_private_chat_message', {
247
+ delivery_id: inbound.delivery.id,
248
+ listener_session_id: sessionId,
249
+ status: 'failed',
250
+ error: errorText,
251
+ })
252
+ return { failed: true, error: errorText }
253
+ }
254
+ }
255
+
256
+ export async function runPrivateChatListener({
257
+ client,
258
+ adapter,
259
+ clientName = CLIENT_NAME,
260
+ clientVersion = CLIENT_VERSION,
261
+ expectedAgentId,
262
+ transport = 'wake',
263
+ fallbackPollMs = FALLBACK_POLL_INTERVAL_MS,
264
+ wakeSubscriptionFactory = createPrivateChatWakeSubscription,
265
+ }) {
266
+ const adapterName = adapter.name ?? 'unknown'
267
+ const heartbeat = await client.callTool('heartbeat_private_chat_listener', {
268
+ client_name: clientName,
269
+ client_version: clientVersion,
270
+ status: 'listening',
271
+ metadata: { adapter: adapterName },
272
+ })
273
+ if (expectedAgentId && heartbeat.agent?.id !== expectedAgentId) {
274
+ throw new Error(
275
+ `Authenticated MCP token resolved to ${heartbeat.agent?.id ?? 'unknown'}; expected ${expectedAgentId}`,
276
+ )
277
+ }
278
+ const sessionId = heartbeat.session_id
279
+ let stopping = false
280
+
281
+ const sendHeartbeat = (status) => client.callTool('heartbeat_private_chat_listener', {
282
+ session_id: sessionId,
283
+ client_name: clientName,
284
+ client_version: clientVersion,
285
+ status,
286
+ metadata: { adapter: adapterName },
287
+ })
288
+
289
+ const heartbeatTimer = setInterval(() => {
290
+ if (!stopping) {
291
+ void sendHeartbeat('listening').catch(() => {})
292
+ }
293
+ }, HEARTBEAT_INTERVAL_MS)
294
+ heartbeatTimer.unref?.()
295
+
296
+ const stop = async () => {
297
+ if (stopping) return
298
+ stopping = true
299
+ clearInterval(heartbeatTimer)
300
+ adapter.close?.()
301
+ await sendHeartbeat('stopped').catch(() => {})
302
+ await client.close?.().catch(() => {})
303
+ }
304
+
305
+ let stopPromise = null
306
+ let resolveStopSignal
307
+ const stopSignal = new Promise((resolve) => {
308
+ resolveStopSignal = resolve
309
+ })
310
+ const requestStop = () => {
311
+ stopPromise ??= stop()
312
+ return stopPromise
313
+ }
314
+ const stopAndResolve = () => {
315
+ void requestStop().finally(() => {
316
+ resolveStopSignal()
317
+ })
318
+ }
319
+
320
+ process.once('SIGINT', stopAndResolve)
321
+ process.once('SIGTERM', stopAndResolve)
322
+
323
+ try {
324
+ if (transport === 'long-poll') {
325
+ while (!stopping) {
326
+ await runOnePrivateChatIteration({
327
+ client,
328
+ adapter,
329
+ sessionId,
330
+ claimTool: 'wait_for_private_chat_message',
331
+ })
332
+ }
333
+ return
334
+ }
335
+
336
+ let draining = false
337
+ let needsDrain = false
338
+ let fatalDrainError = null
339
+ let wakeHealthy = false
340
+
341
+ const drainOnce = async () => {
342
+ if (draining) {
343
+ needsDrain = true
344
+ return
345
+ }
346
+ draining = true
347
+ try {
348
+ while (!stopping) {
349
+ needsDrain = false
350
+ const result = await runOnePrivateChatIteration({
351
+ client,
352
+ adapter,
353
+ sessionId,
354
+ claimTool: 'claim_private_chat_message',
355
+ })
356
+ if (result.timed_out && !needsDrain) break
357
+ }
358
+ } finally {
359
+ draining = false
360
+ }
361
+ }
362
+
363
+ const launchDrain = () => {
364
+ void drainOnce().catch((error) => {
365
+ if (stopping) return
366
+ fatalDrainError = error
367
+ void requestStop().finally(() => {
368
+ resolveStopSignal()
369
+ })
370
+ })
371
+ }
372
+
373
+ let wakeSubscription = null
374
+ if (heartbeat.wake) {
375
+ wakeSubscription = await wakeSubscriptionFactory({
376
+ wake: heartbeat.wake,
377
+ onWake: launchDrain,
378
+ onStatus: (status) => {
379
+ if (status === 'SUBSCRIBED') {
380
+ wakeHealthy = true
381
+ }
382
+ if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT' || status === 'CLOSED') {
383
+ wakeHealthy = false
384
+ console.warn(`[foundr:listen] wake channel ${status}; fallback polling remains active`)
385
+ }
386
+ },
387
+ }).catch((error) => {
388
+ console.warn(`[foundr:listen] wake subscription unavailable: ${boundedError(error)}`)
389
+ return null
390
+ })
391
+ }
392
+
393
+ void adapter.start?.().catch((error) => {
394
+ if (!stopping) {
395
+ console.warn(`[foundr:listen] adapter warmup failed: ${boundedError(error)}`)
396
+ }
397
+ })
398
+
399
+ const effectiveFallbackPollMs = wakeSubscription ? wakeFallbackPollMs(fallbackPollMs) : fallbackPollMs
400
+ const fallbackTimer = setInterval(() => {
401
+ if (!stopping && (!wakeSubscription || !wakeHealthy)) launchDrain()
402
+ }, effectiveFallbackPollMs)
403
+ if (wakeSubscription) {
404
+ fallbackTimer.unref?.()
405
+ } else {
406
+ launchDrain()
407
+ }
408
+
409
+ await stopSignal
410
+ clearInterval(fallbackTimer)
411
+ await Promise.resolve(wakeSubscription?.close?.()).catch(() => {})
412
+ if (fatalDrainError) {
413
+ throw fatalDrainError
414
+ }
415
+ } finally {
416
+ process.off('SIGINT', stopAndResolve)
417
+ process.off('SIGTERM', stopAndResolve)
418
+ if (stopPromise) {
419
+ await stopPromise
420
+ } else if (!stopping) {
421
+ await requestStop()
422
+ }
423
+ }
424
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener-loop.mjs","sourceRoot":"","sources":["../../src/bridge/listener-loop.mjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export function revocationEndpointForMcpUrl(mcpUrl: any): URL;
2
+ export function revokeRefreshTokenGrant({ auth, fetchImpl }?: {
3
+ fetchImpl?: typeof fetch | undefined;
4
+ }): Promise<boolean>;
5
+ export function logoutFoundrBridge({ loadAuth, deleteAuth, fetchImpl }?: {
6
+ fetchImpl?: typeof fetch | undefined;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=logout.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.mts","sourceRoot":"","sources":["../../src/bridge/logout.mjs"],"names":[],"mappings":"AAEA,8DAMC;AAED;;qBAgBC;AAED;;kBAMC"}
@@ -0,0 +1,35 @@
1
+ const DEFAULT_REVOCATION_PATH = '/api/ee/oauth/token/revocation'
2
+
3
+ export function revocationEndpointForMcpUrl(mcpUrl) {
4
+ const url = new URL(mcpUrl || 'https://www.foundr.world/api/mcp')
5
+ url.pathname = DEFAULT_REVOCATION_PATH
6
+ url.search = ''
7
+ url.hash = ''
8
+ return url
9
+ }
10
+
11
+ export async function revokeRefreshTokenGrant({ auth, fetchImpl = fetch } = {}) {
12
+ const refreshToken = auth?.tokens?.refresh_token
13
+ const clientId = auth?.clientInformation?.client_id
14
+ if (!refreshToken || !clientId) return false
15
+
16
+ const body = new URLSearchParams({
17
+ token: refreshToken,
18
+ token_type_hint: 'refresh_token',
19
+ client_id: clientId,
20
+ })
21
+ await fetchImpl(revocationEndpointForMcpUrl(auth.mcpUrl), {
22
+ method: 'POST',
23
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
24
+ body,
25
+ }).catch(() => null)
26
+ return true
27
+ }
28
+
29
+ export async function logoutFoundrBridge({ loadAuth, deleteAuth, fetchImpl = fetch } = {}) {
30
+ const auth = await loadAuth().catch(() => null)
31
+ if (auth) {
32
+ await revokeRefreshTokenGrant({ auth, fetchImpl })
33
+ }
34
+ await deleteAuth()
35
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.mjs","sourceRoot":"","sources":["../../src/bridge/logout.mjs"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,gCAAgC,CAAA;AAEhE,MAAM,UAAU,2BAA2B,CAAC,MAAM;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,kCAAkC,CAAC,CAAA;IACjE,GAAG,CAAC,QAAQ,GAAG,uBAAuB,CAAA;IACtC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAA;IACf,GAAG,CAAC,IAAI,GAAG,EAAE,CAAA;IACb,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,EAAE;;IAC5E,MAAM,YAAY,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,aAAa,CAAA;IAChD,MAAM,QAAQ,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,iBAAiB,0CAAE,SAAS,CAAA;IACnD,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IAE5C,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,KAAK,EAAE,YAAY;QACnB,eAAe,EAAE,eAAe;QAChC,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IACF,MAAM,SAAS,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI;KACL,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,EAAE;IACvF,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,uBAAuB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,UAAU,EAAE,CAAA;AACpB,CAAC"}
@@ -0,0 +1,97 @@
1
+ export function createOAuthCallbackWaiter({ port }?: {
2
+ port?: number | undefined;
3
+ }): {
4
+ ready: Promise<any>;
5
+ code: Promise<any>;
6
+ close(): void;
7
+ };
8
+ export function waitForOAuthCallback({ port }?: {
9
+ port?: number | undefined;
10
+ }): Promise<any>;
11
+ export function createTransport(mcpUrl: any, authProvider: any): StreamableHTTPClientTransport;
12
+ export function vercelProtectionBypass(): string;
13
+ export function withVercelProtectionBypass(url: any): any;
14
+ export function callDirectJson({ mcpUrl, authProvider, path, body, fetchImpl, }?: {
15
+ body?: {} | undefined;
16
+ fetchImpl?: typeof fetch | undefined;
17
+ }): Promise<any>;
18
+ export function parseToolResult(result: any): any;
19
+ export function createMcpClient({ mcpUrl, authProvider, clientFactory, transportFactory, oauthCallbackFactory, }?: {
20
+ clientFactory?: (() => Client<{
21
+ method: string;
22
+ params?: {
23
+ [x: string]: unknown;
24
+ _meta?: {
25
+ [x: string]: unknown;
26
+ progressToken?: string | number | undefined;
27
+ "io.modelcontextprotocol/related-task"?: {
28
+ taskId: string;
29
+ } | undefined;
30
+ } | undefined;
31
+ } | undefined;
32
+ }, {
33
+ method: string;
34
+ params?: {
35
+ [x: string]: unknown;
36
+ _meta?: {
37
+ [x: string]: unknown;
38
+ progressToken?: string | number | undefined;
39
+ "io.modelcontextprotocol/related-task"?: {
40
+ taskId: string;
41
+ } | undefined;
42
+ } | undefined;
43
+ } | undefined;
44
+ }, {
45
+ [x: string]: unknown;
46
+ _meta?: {
47
+ [x: string]: unknown;
48
+ progressToken?: string | number | undefined;
49
+ "io.modelcontextprotocol/related-task"?: {
50
+ taskId: string;
51
+ } | undefined;
52
+ } | undefined;
53
+ }>) | undefined;
54
+ transportFactory?: typeof createTransport | undefined;
55
+ oauthCallbackFactory?: typeof createOAuthCallbackWaiter | undefined;
56
+ }): Promise<{
57
+ client: Client<{
58
+ method: string;
59
+ params?: {
60
+ [x: string]: unknown;
61
+ _meta?: {
62
+ [x: string]: unknown;
63
+ progressToken?: string | number | undefined;
64
+ "io.modelcontextprotocol/related-task"?: {
65
+ taskId: string;
66
+ } | undefined;
67
+ } | undefined;
68
+ } | undefined;
69
+ }, {
70
+ method: string;
71
+ params?: {
72
+ [x: string]: unknown;
73
+ _meta?: {
74
+ [x: string]: unknown;
75
+ progressToken?: string | number | undefined;
76
+ "io.modelcontextprotocol/related-task"?: {
77
+ taskId: string;
78
+ } | undefined;
79
+ } | undefined;
80
+ } | undefined;
81
+ }, {
82
+ [x: string]: unknown;
83
+ _meta?: {
84
+ [x: string]: unknown;
85
+ progressToken?: string | number | undefined;
86
+ "io.modelcontextprotocol/related-task"?: {
87
+ taskId: string;
88
+ } | undefined;
89
+ } | undefined;
90
+ }>;
91
+ callTool(name: any, args?: {}): Promise<any>;
92
+ callJson(path: any, body?: {}): Promise<any>;
93
+ close(): Promise<void>;
94
+ }>;
95
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
96
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
97
+ //# sourceMappingURL=mcp-client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.mts","sourceRoot":"","sources":["../../src/bridge/mcp-client.mjs"],"names":[],"mappings":"AAOA;;;;;;EAyFC;AAED;;iBAEC;AAED,+FAUC;AAED,iDAOC;AAED,0DAQC;AAiCD;;;iBA8BC;AA2BD,kDAOC;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CC;8CA9R6C,oDAAoD;uBAF3E,2CAA2C"}