@giselles-ai/browser-tool 0.1.18 → 0.1.20
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/mcp-server/index.js +15 -1
- package/dist/relay/index.js +82 -1
- package/package.json +1 -1
package/dist/mcp-server/index.js
CHANGED
|
@@ -113,6 +113,13 @@ function requiredEnv(name) {
|
|
|
113
113
|
function trimTrailingSlash(input) {
|
|
114
114
|
return input.replace(/\/+$/, "");
|
|
115
115
|
}
|
|
116
|
+
function safeJsonStringify(value) {
|
|
117
|
+
try {
|
|
118
|
+
return JSON.stringify(value);
|
|
119
|
+
} catch {
|
|
120
|
+
return String(value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
116
123
|
var RelayClient = class {
|
|
117
124
|
url;
|
|
118
125
|
sessionId;
|
|
@@ -194,7 +201,14 @@ var RelayClient = class {
|
|
|
194
201
|
}
|
|
195
202
|
const success = dispatchSuccessSchema.safeParse(body);
|
|
196
203
|
if (!success.success) {
|
|
197
|
-
throw new Error(
|
|
204
|
+
throw new Error(
|
|
205
|
+
[
|
|
206
|
+
"Relay dispatch returned an unexpected payload.",
|
|
207
|
+
`status=${response.status}`,
|
|
208
|
+
`url=${this.url}`,
|
|
209
|
+
`body=${safeJsonStringify(body)}`
|
|
210
|
+
].join(" ")
|
|
211
|
+
);
|
|
198
212
|
}
|
|
199
213
|
if (!response.ok) {
|
|
200
214
|
throw new Error(`Relay dispatch failed with HTTP ${response.status}.`);
|
package/dist/relay/index.js
CHANGED
|
@@ -581,6 +581,44 @@ var postBodySchema = z2.discriminatedUnion("type", [
|
|
|
581
581
|
dispatchSchema,
|
|
582
582
|
respondSchema
|
|
583
583
|
]);
|
|
584
|
+
function summarizeRelayRequestForLog(request) {
|
|
585
|
+
if (request.type === "snapshot_request") {
|
|
586
|
+
return {
|
|
587
|
+
type: request.type,
|
|
588
|
+
requestId: request.requestId,
|
|
589
|
+
instruction: request.instruction
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
return {
|
|
593
|
+
type: request.type,
|
|
594
|
+
requestId: request.requestId,
|
|
595
|
+
actionCount: request.actions.length,
|
|
596
|
+
fieldCount: request.fields.length
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
function summarizeRelayResponseForLog(response) {
|
|
600
|
+
if (response.type === "snapshot_response") {
|
|
601
|
+
return {
|
|
602
|
+
type: response.type,
|
|
603
|
+
requestId: response.requestId,
|
|
604
|
+
fieldCount: response.fields.length
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
if (response.type === "execute_response") {
|
|
608
|
+
return {
|
|
609
|
+
type: response.type,
|
|
610
|
+
requestId: response.requestId,
|
|
611
|
+
applied: response.report.applied,
|
|
612
|
+
skipped: response.report.skipped,
|
|
613
|
+
warningCount: response.report.warnings.length
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
return {
|
|
617
|
+
type: response.type,
|
|
618
|
+
requestId: response.requestId,
|
|
619
|
+
message: response.message
|
|
620
|
+
};
|
|
621
|
+
}
|
|
584
622
|
function createRelayEventsRoute(request) {
|
|
585
623
|
const cors = corsHeaders(request);
|
|
586
624
|
const url = new URL(request.url);
|
|
@@ -751,6 +789,10 @@ async function createRelayPostRoute(request) {
|
|
|
751
789
|
);
|
|
752
790
|
}
|
|
753
791
|
if (parsed.data.type === "relay.dispatch") {
|
|
792
|
+
console.info(`${LOG_PREFIX} post.dispatch`, {
|
|
793
|
+
sessionId: parsed.data.sessionId,
|
|
794
|
+
request: summarizeRelayRequestForLog(parsed.data.request)
|
|
795
|
+
});
|
|
754
796
|
try {
|
|
755
797
|
const response = await dispatchRelayRequest({
|
|
756
798
|
sessionId: parsed.data.sessionId,
|
|
@@ -758,24 +800,46 @@ async function createRelayPostRoute(request) {
|
|
|
758
800
|
request: parsed.data.request,
|
|
759
801
|
timeoutMs: parsed.data.timeoutMs
|
|
760
802
|
});
|
|
803
|
+
console.info(`${LOG_PREFIX} post.dispatch.ok`, {
|
|
804
|
+
sessionId: parsed.data.sessionId,
|
|
805
|
+
response: summarizeRelayResponseForLog(response)
|
|
806
|
+
});
|
|
761
807
|
return Response.json({ ok: true, response }, { headers: cors });
|
|
762
808
|
} catch (error) {
|
|
763
809
|
const relayError = toRelayError(error);
|
|
810
|
+
console.error(`${LOG_PREFIX} post.dispatch.error`, {
|
|
811
|
+
sessionId: parsed.data.sessionId,
|
|
812
|
+
errorCode: relayError.code,
|
|
813
|
+
message: relayError.message
|
|
814
|
+
});
|
|
764
815
|
return Response.json(
|
|
765
816
|
{ ok: false, errorCode: relayError.code, message: relayError.message },
|
|
766
817
|
{ status: relayError.status, headers: cors }
|
|
767
818
|
);
|
|
768
819
|
}
|
|
769
820
|
}
|
|
821
|
+
console.info(`${LOG_PREFIX} post.respond`, {
|
|
822
|
+
sessionId: parsed.data.sessionId,
|
|
823
|
+
response: summarizeRelayResponseForLog(parsed.data.response)
|
|
824
|
+
});
|
|
770
825
|
try {
|
|
771
826
|
await resolveRelayResponse({
|
|
772
827
|
sessionId: parsed.data.sessionId,
|
|
773
828
|
token: parsed.data.token,
|
|
774
829
|
response: parsed.data.response
|
|
775
830
|
});
|
|
831
|
+
console.info(`${LOG_PREFIX} post.respond.ok`, {
|
|
832
|
+
sessionId: parsed.data.sessionId,
|
|
833
|
+
requestId: parsed.data.response.requestId
|
|
834
|
+
});
|
|
776
835
|
return Response.json({ ok: true }, { headers: cors });
|
|
777
836
|
} catch (error) {
|
|
778
837
|
const relayError = toRelayError(error);
|
|
838
|
+
console.error(`${LOG_PREFIX} post.respond.error`, {
|
|
839
|
+
sessionId: parsed.data.sessionId,
|
|
840
|
+
errorCode: relayError.code,
|
|
841
|
+
message: relayError.message
|
|
842
|
+
});
|
|
779
843
|
return Response.json(
|
|
780
844
|
{ ok: false, errorCode: relayError.code, message: relayError.message },
|
|
781
845
|
{ status: relayError.status, headers: cors }
|
|
@@ -795,7 +859,20 @@ async function createRelayRequestSubscription(input) {
|
|
|
795
859
|
await assertRelaySession(input.sessionId, input.token);
|
|
796
860
|
const subscriber = createRelaySubscriber();
|
|
797
861
|
const channel = relayRequestChannel(input.sessionId);
|
|
798
|
-
|
|
862
|
+
let keepaliveId = null;
|
|
863
|
+
try {
|
|
864
|
+
await subscriber.subscribe(channel);
|
|
865
|
+
await markBrowserConnected(input.sessionId, input.token);
|
|
866
|
+
keepaliveId = setInterval(() => {
|
|
867
|
+
void touchBrowserConnected(input.sessionId).catch(() => void 0);
|
|
868
|
+
}, RELAY_SSE_KEEPALIVE_INTERVAL_MS);
|
|
869
|
+
} catch (error) {
|
|
870
|
+
await subscriber.unsubscribe(channel).catch(() => void 0);
|
|
871
|
+
await subscriber.quit().catch(() => {
|
|
872
|
+
subscriber.disconnect();
|
|
873
|
+
});
|
|
874
|
+
throw error;
|
|
875
|
+
}
|
|
799
876
|
const nextRequest = () => {
|
|
800
877
|
return new Promise((resolve, reject) => {
|
|
801
878
|
const onMessage = (_channel, message) => {
|
|
@@ -829,6 +906,10 @@ async function createRelayRequestSubscription(input) {
|
|
|
829
906
|
});
|
|
830
907
|
};
|
|
831
908
|
const close = async () => {
|
|
909
|
+
if (keepaliveId) {
|
|
910
|
+
clearInterval(keepaliveId);
|
|
911
|
+
keepaliveId = null;
|
|
912
|
+
}
|
|
832
913
|
await subscriber.unsubscribe(channel).catch(() => void 0);
|
|
833
914
|
await subscriber.quit().catch(() => {
|
|
834
915
|
subscriber.disconnect();
|