@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.
@@ -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("Relay dispatch returned an unexpected payload.");
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}.`);
@@ -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
- await subscriber.subscribe(channel);
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();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giselles-ai/browser-tool",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "Apache-2.0",