opendevbrowser 0.0.25 → 0.0.26

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 (37) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-Z6ENAZUN.js → chunk-AVQL6WAS.js} +9 -2
  3. package/dist/chunk-AVQL6WAS.js.map +1 -0
  4. package/dist/{chunk-7U63PZ4W.js → chunk-GTTYIAI7.js} +369 -175
  5. package/dist/chunk-GTTYIAI7.js.map +1 -0
  6. package/dist/cli/commands/daemon.d.ts +25 -0
  7. package/dist/cli/commands/daemon.d.ts.map +1 -1
  8. package/dist/cli/commands/serve.d.ts +10 -13
  9. package/dist/cli/commands/serve.d.ts.map +1 -1
  10. package/dist/cli/commands/status.d.ts.map +1 -1
  11. package/dist/cli/daemon-client.d.ts.map +1 -1
  12. package/dist/cli/daemon-status-policy.d.ts +6 -0
  13. package/dist/cli/daemon-status-policy.d.ts.map +1 -0
  14. package/dist/cli/daemon-status.d.ts +1 -0
  15. package/dist/cli/daemon-status.d.ts.map +1 -1
  16. package/dist/cli/daemon.d.ts +5 -0
  17. package/dist/cli/daemon.d.ts.map +1 -1
  18. package/dist/cli/index.js +175 -96
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/utils/http.d.ts.map +1 -1
  21. package/dist/daemon-fingerprint.json +3 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +109 -28
  24. package/dist/index.js.map +1 -1
  25. package/dist/opendevbrowser.d.ts.map +1 -1
  26. package/dist/opendevbrowser.js +109 -28
  27. package/dist/opendevbrowser.js.map +1 -1
  28. package/dist/providers/inspiredesign-capture.d.ts.map +1 -1
  29. package/dist/providers/workflows.d.ts.map +1 -1
  30. package/dist/{providers-CYEJZVXB.js → providers-T2FQJCF6.js} +2 -2
  31. package/dist/tools/index.d.ts.map +1 -1
  32. package/dist/tools/status.d.ts.map +1 -1
  33. package/extension/manifest.json +1 -1
  34. package/package.json +1 -1
  35. package/dist/chunk-7U63PZ4W.js.map +0 -1
  36. package/dist/chunk-Z6ENAZUN.js.map +0 -1
  37. /package/dist/{providers-CYEJZVXB.js.map → providers-T2FQJCF6.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/http.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA6FF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,SAAc,EACpB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,SAAc,EACpB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,2BAA2B,CAAC,CAAC,EACjD,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAEZ"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/http.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAgGF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,SAAc,EACpB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,SAAc,EACpB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,2BAA2B,CAAC,CAAC,EACjD,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAEZ"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "fingerprint": "8f1cedae1be3e8b9cb97b2b12d601a17efcf449695256583b5c86a79b6036b63"
3
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAuClD,QAAA,MAAM,oBAAoB,EAAE,MAsQ3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA8ClD,QAAA,MAAM,oBAAoB,EAAE,MAmW3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  AGENT_INBOX_SYSTEM_MARKER,
3
+ DEFAULT_DAEMON_STATUS_FETCH_OPTIONS,
3
4
  DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS,
4
5
  DaemonClient,
5
6
  ScriptRunner,
@@ -11,19 +12,22 @@ import {
11
12
  classifySessionRelayEndpoint,
12
13
  createAutomationCoordinator,
13
14
  createCoreRuntimeAssemblies,
15
+ createDaemonStopHeaders,
14
16
  createOpenDevBrowserCore,
15
17
  executeMacroWithRuntime,
16
18
  extractExtension,
19
+ fetchDaemonStatus,
17
20
  fetchDaemonStatusFromMetadata,
18
- getCurrentDaemonFingerprint,
21
+ fetchWithTimeout,
19
22
  inspectSession,
23
+ isCurrentDaemonFingerprint,
20
24
  onboarding_metadata_default,
21
25
  readDaemonMetadata,
22
26
  requireChallengeOrchestrationConfig,
23
27
  resolveBundledProviderRuntime,
24
28
  resolveSessionRelayRoute,
25
29
  startDaemon
26
- } from "./chunk-7U63PZ4W.js";
30
+ } from "./chunk-GTTYIAI7.js";
27
31
  import "./chunk-STGGGVYT.js";
28
32
  import "./chunk-3ILXPKSJ.js";
29
33
  import "./chunk-TBUCZX4A.js";
@@ -35,7 +39,7 @@ import {
35
39
  classifyBlockerSignal,
36
40
  createRequestId,
37
41
  resolveInspiredesignCaptureMode
38
- } from "./chunk-Z6ENAZUN.js";
42
+ } from "./chunk-AVQL6WAS.js";
39
43
  import "./chunk-FUSXMW3G.js";
40
44
 
41
45
  // src/cli/remote-manager.ts
@@ -1075,7 +1079,7 @@ function createStatusTool(deps) {
1075
1079
  let updateHint;
1076
1080
  let sessionStatus = null;
1077
1081
  if (hubEnabled) {
1078
- const daemonStatus = await fetchDaemonStatusFromMetadata();
1082
+ const daemonStatus = await fetchDaemonStatusFromMetadata(config, DEFAULT_DAEMON_STATUS_FETCH_OPTIONS);
1079
1083
  if (!daemonStatus) {
1080
1084
  return failure("Daemon not running. Start with `npx opendevbrowser serve`.", "status_failed");
1081
1085
  }
@@ -3188,7 +3192,7 @@ function createResearchRunTool(deps) {
3188
3192
  async execute(args) {
3189
3193
  try {
3190
3194
  const runtime = await resolveProviderRuntime(deps);
3191
- const { runResearchWorkflow } = await import("./providers-CYEJZVXB.js");
3195
+ const { runResearchWorkflow } = await import("./providers-T2FQJCF6.js");
3192
3196
  const result = await runResearchWorkflow(runtime, {
3193
3197
  topic: args.topic,
3194
3198
  days: args.days,
@@ -3239,7 +3243,7 @@ function createShoppingRunTool(deps) {
3239
3243
  async execute(args) {
3240
3244
  try {
3241
3245
  const runtime = await resolveProviderRuntime(deps);
3242
- const { runShoppingWorkflow } = await import("./providers-CYEJZVXB.js");
3246
+ const { runShoppingWorkflow } = await import("./providers-T2FQJCF6.js");
3243
3247
  const result = await runShoppingWorkflow(runtime, {
3244
3248
  query: args.query,
3245
3249
  providers: args.providers,
@@ -3308,7 +3312,7 @@ function createProductVideoRunTool(deps) {
3308
3312
  async execute(args) {
3309
3313
  try {
3310
3314
  const runtime = await resolveProviderRuntime(deps);
3311
- const { runProductVideoWorkflow } = await import("./providers-CYEJZVXB.js");
3315
+ const { runProductVideoWorkflow } = await import("./providers-T2FQJCF6.js");
3312
3316
  const includeScreenshots = args.include_screenshots ?? true;
3313
3317
  const result = await runProductVideoWorkflow(runtime, {
3314
3318
  product_url: args.product_url,
@@ -3360,7 +3364,7 @@ function createInspiredesignRunTool(deps) {
3360
3364
  async execute(args) {
3361
3365
  try {
3362
3366
  const runtime = await resolveProviderRuntime(deps);
3363
- const { runInspiredesignWorkflow } = await import("./providers-CYEJZVXB.js");
3367
+ const { runInspiredesignWorkflow } = await import("./providers-T2FQJCF6.js");
3364
3368
  const captureMode = resolveInspiredesignCaptureMode(args.captureMode, args.urls);
3365
3369
  const cookieSource = deps.config.get().providers?.cookieSource;
3366
3370
  const result = await runInspiredesignWorkflow(runtime, {
@@ -3473,7 +3477,9 @@ function createTools(deps) {
3473
3477
  execute: async (args, context) => {
3474
3478
  try {
3475
3479
  await deps.ensureHub?.();
3476
- } catch {
3480
+ } catch (error) {
3481
+ const serialized = serializeError(error);
3482
+ return failure(serialized.message, serialized.code ?? "hub_unavailable", serialized.details);
3477
3483
  }
3478
3484
  return definition.execute(args, context);
3479
3485
  }
@@ -3643,6 +3649,69 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
3643
3649
  toolDeps.providerRuntime = providerRuntime;
3644
3650
  toolDeps.browserFallbackPort = browserFallbackPort;
3645
3651
  };
3652
+ const readEnsureHubBudgetMs = (deadlineMs) => {
3653
+ const remainingMs = deadlineMs - Date.now();
3654
+ return remainingMs > 0 ? remainingMs : null;
3655
+ };
3656
+ const stopTimeoutMs = (deadlineMs) => {
3657
+ return Math.max(1, Math.min(500, readEnsureHubBudgetMs(deadlineMs) ?? 1));
3658
+ };
3659
+ const resolveHubStopConnection = (currentConfig, status) => {
3660
+ const metadata = readDaemonMetadata();
3661
+ if (metadata?.pid === status.pid) {
3662
+ return { port: metadata.port, token: metadata.token };
3663
+ }
3664
+ return { port: currentConfig.daemonPort, token: currentConfig.daemonToken };
3665
+ };
3666
+ const isConfiguredHubConnection = (currentConfig, connection) => {
3667
+ return connection.port === currentConfig.daemonPort && connection.token === currentConfig.daemonToken;
3668
+ };
3669
+ const waitForHubDaemonShutdown = async (connection, deadlineMs) => {
3670
+ while (readEnsureHubBudgetMs(deadlineMs)) {
3671
+ const status = await fetchDaemonStatus(connection.port, connection.token, {
3672
+ timeoutMs: stopTimeoutMs(deadlineMs)
3673
+ });
3674
+ if (!status?.ok) {
3675
+ return true;
3676
+ }
3677
+ await new Promise((resolve) => setTimeout(resolve, Math.min(100, stopTimeoutMs(deadlineMs))));
3678
+ }
3679
+ return false;
3680
+ };
3681
+ const stopMismatchedHubDaemon = async (currentConfig, status, deadlineMs) => {
3682
+ const connection = resolveHubStopConnection(currentConfig, status);
3683
+ const configuredConnection = isConfiguredHubConnection(currentConfig, connection);
3684
+ let response;
3685
+ try {
3686
+ response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/stop`, {
3687
+ method: "POST",
3688
+ headers: createDaemonStopHeaders(connection.token, "plugin.ensureHub.upgrade")
3689
+ }, stopTimeoutMs(deadlineMs));
3690
+ } catch (error) {
3691
+ if (!configuredConnection) {
3692
+ return;
3693
+ }
3694
+ throw error instanceof Error ? error : new Error(String(error));
3695
+ }
3696
+ if (response.status === 409) {
3697
+ if (!configuredConnection) {
3698
+ return;
3699
+ }
3700
+ throw new Error(`Hub daemon on 127.0.0.1:${connection.port} pid=${status.pid} is protected by a different opendevbrowser build.`);
3701
+ }
3702
+ if (!response.ok) {
3703
+ if (!configuredConnection) {
3704
+ return;
3705
+ }
3706
+ throw new Error(`Hub daemon stop failed with status ${response.status}.`);
3707
+ }
3708
+ if (!await waitForHubDaemonShutdown(connection, deadlineMs)) {
3709
+ if (!configuredConnection) {
3710
+ return;
3711
+ }
3712
+ throw new Error(`Timed out waiting for hub daemon on 127.0.0.1:${connection.port} to stop.`);
3713
+ }
3714
+ };
3646
3715
  const ensureHub = async () => {
3647
3716
  const currentConfig = configStore.get();
3648
3717
  if (!isHubEnabled(currentConfig)) {
@@ -3654,29 +3723,26 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
3654
3723
  const deadline = Date.now() + 2e3;
3655
3724
  let attempt = 0;
3656
3725
  let lastError = null;
3657
- const currentFingerprint = getCurrentDaemonFingerprint();
3658
3726
  while (attempt < 2 && Date.now() < deadline) {
3659
3727
  attempt += 1;
3660
- const status = await fetchDaemonStatusFromMetadata(currentConfig);
3661
- if (status?.ok && status.fingerprint === currentFingerprint) {
3662
- bindRemote();
3663
- await relay?.refresh?.();
3664
- return;
3728
+ const statusTimeoutMs = readEnsureHubBudgetMs(deadline);
3729
+ if (!statusTimeoutMs) {
3730
+ break;
3665
3731
  }
3732
+ const status = await fetchDaemonStatusFromMetadata(currentConfig, {
3733
+ ...DEFAULT_DAEMON_STATUS_FETCH_OPTIONS,
3734
+ timeoutMs: statusTimeoutMs
3735
+ });
3666
3736
  if (status?.ok) {
3667
- const metadata = readDaemonMetadata();
3668
- const daemonPort = metadata?.port ?? currentConfig.daemonPort;
3669
- const daemonToken = metadata?.token ?? currentConfig.daemonToken;
3670
- if (daemonPort > 0 && daemonToken) {
3671
- try {
3672
- await fetch(`http://127.0.0.1:${daemonPort}/stop`, {
3673
- method: "POST",
3674
- headers: { Authorization: `Bearer ${daemonToken}` }
3675
- });
3676
- } catch (error) {
3677
- lastError = error instanceof Error ? error : new Error(String(error));
3678
- }
3737
+ if (isCurrentDaemonFingerprint(status.fingerprint)) {
3738
+ bindRemote();
3739
+ await relay?.refresh?.();
3740
+ return;
3679
3741
  }
3742
+ await stopMismatchedHubDaemon(currentConfig, status, deadline);
3743
+ }
3744
+ if (!readEnsureHubBudgetMs(deadline)) {
3745
+ break;
3680
3746
  }
3681
3747
  try {
3682
3748
  const { stop } = await startDaemon({ config: currentConfig, directory, worktree });
@@ -3684,6 +3750,22 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
3684
3750
  } catch (error) {
3685
3751
  lastError = error instanceof Error ? error : new Error(String(error));
3686
3752
  }
3753
+ const refreshedTimeoutMs = readEnsureHubBudgetMs(deadline);
3754
+ if (!refreshedTimeoutMs) {
3755
+ break;
3756
+ }
3757
+ const refreshedStatus = await fetchDaemonStatusFromMetadata(currentConfig, {
3758
+ ...DEFAULT_DAEMON_STATUS_FETCH_OPTIONS,
3759
+ timeoutMs: refreshedTimeoutMs
3760
+ });
3761
+ if (refreshedStatus?.ok) {
3762
+ if (isCurrentDaemonFingerprint(refreshedStatus.fingerprint)) {
3763
+ bindRemote();
3764
+ await relay?.refresh?.();
3765
+ return;
3766
+ }
3767
+ await stopMismatchedHubDaemon(currentConfig, refreshedStatus, deadline);
3768
+ }
3687
3769
  if (Date.now() < deadline) {
3688
3770
  await new Promise((resolve) => setTimeout(resolve, 500));
3689
3771
  }
@@ -3696,7 +3778,6 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
3696
3778
  toolDeps.ensureHub = ensureHub;
3697
3779
  const hubEnabled = isHubEnabled(config);
3698
3780
  if (hubEnabled) {
3699
- bindRemote();
3700
3781
  try {
3701
3782
  await ensureHub();
3702
3783
  } catch (error) {