opensteer 0.8.11 → 0.8.12

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/cli/bin.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var process2 = require('process');
4
+ var process3 = require('process');
5
5
  var child_process = require('child_process');
6
6
  var crypto = require('crypto');
7
7
  var promises = require('fs/promises');
@@ -42,7 +42,8 @@ function _interopNamespace(e) {
42
42
  return Object.freeze(n);
43
43
  }
44
44
 
45
- var process2__default = /*#__PURE__*/_interopDefault(process2);
45
+ var process3__default = /*#__PURE__*/_interopDefault(process3);
46
+ var os__default = /*#__PURE__*/_interopDefault(os);
46
47
  var path7__default = /*#__PURE__*/_interopDefault(path7);
47
48
  var sharp__default = /*#__PURE__*/_interopDefault(sharp);
48
49
  var cheerio__namespace = /*#__PURE__*/_interopNamespace(cheerio);
@@ -11533,6 +11534,7 @@ function collectEnvironment(baseEnv, predicate) {
11533
11534
  async function loadCliEnvironment(cwd) {
11534
11535
  loadEnvironment(cwd);
11535
11536
  }
11537
+ var OPENSTEER_GITHUB_SOURCE = "steerlabs/opensteer";
11536
11538
  function createOpensteerSkillsInvocation(input) {
11537
11539
  const cliArgs = ["add", input.skillSourcePath];
11538
11540
  if (input.options.all === true) {
@@ -11573,7 +11575,7 @@ function resolveOpensteerSkillsCliPath() {
11573
11575
  }
11574
11576
  return cliPath;
11575
11577
  }
11576
- function resolveOpensteerSkillSourcePath() {
11578
+ function resolveOpensteerLocalSkillSourcePath() {
11577
11579
  let ancestor = path7__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bin.cjs', document.baseURI).href))));
11578
11580
  for (let index = 0; index < 6; index += 1) {
11579
11581
  const candidate = path7__default.default.join(ancestor, "skills");
@@ -11585,17 +11587,32 @@ function resolveOpensteerSkillSourcePath() {
11585
11587
  }
11586
11588
  throw new Error("Unable to find the packaged Opensteer skill source directory.");
11587
11589
  }
11590
+ async function checkOpensteerGitHubReachable() {
11591
+ try {
11592
+ const response = await fetch(`https://github.com/${OPENSTEER_GITHUB_SOURCE}`, {
11593
+ method: "HEAD",
11594
+ signal: AbortSignal.timeout(3e3),
11595
+ redirect: "manual"
11596
+ });
11597
+ return response.status < 500;
11598
+ } catch {
11599
+ return false;
11600
+ }
11601
+ }
11588
11602
  async function runOpensteerSkillsInstaller(options = {}, overrideDeps = {}) {
11589
11603
  const deps = {
11590
11604
  resolveSkillsCliPath: resolveOpensteerSkillsCliPath,
11591
- resolveSkillSourcePath: resolveOpensteerSkillSourcePath,
11605
+ resolveLocalSkillSourcePath: resolveOpensteerLocalSkillSourcePath,
11606
+ checkGitHubReachable: checkOpensteerGitHubReachable,
11592
11607
  spawnInvocation: spawnOpensteerSkillsInvocation,
11593
11608
  ...overrideDeps
11594
11609
  };
11610
+ const useGitHub = await deps.checkGitHubReachable();
11611
+ const skillSourcePath = useGitHub ? OPENSTEER_GITHUB_SOURCE : deps.resolveLocalSkillSourcePath();
11595
11612
  const invocation = createOpensteerSkillsInvocation({
11596
11613
  options,
11597
11614
  skillsCliPath: deps.resolveSkillsCliPath(),
11598
- skillSourcePath: deps.resolveSkillSourcePath()
11615
+ skillSourcePath
11599
11616
  });
11600
11617
  return deps.spawnInvocation(invocation);
11601
11618
  }
@@ -12353,6 +12370,15 @@ function resolveCloudConfig(input = {}) {
12353
12370
  ...cloudProvider?.browserProfile === void 0 ? {} : { browserProfile: cloudProvider.browserProfile }
12354
12371
  };
12355
12372
  }
12373
+ function requireCloudAppBaseUrl(cloudConfig) {
12374
+ const appBaseUrl = cloudConfig.appBaseUrl;
12375
+ if (!appBaseUrl || appBaseUrl.trim().length === 0) {
12376
+ throw new Error(
12377
+ 'record with provider=cloud requires OPENSTEER_CLOUD_APP_BASE_URL or "--cloud-app-base-url".'
12378
+ );
12379
+ }
12380
+ return appBaseUrl.trim().replace(/\/+$/, "");
12381
+ }
12356
12382
 
12357
12383
  // ../runtime-core/package.json
12358
12384
  var package_default2 = {
@@ -36326,6 +36352,43 @@ function formatLaneRow(input) {
36326
36352
  const summary = input.summary.padEnd(16, " ");
36327
36353
  return `${input.marker} ${provider} ${status} ${summary}${input.detail ?? ""}`.trimEnd();
36328
36354
  }
36355
+ async function openBrowserUrl(url) {
36356
+ const command = resolveOpenBrowserCommand(url);
36357
+ await new Promise((resolve4, reject) => {
36358
+ const child = child_process.spawn(command.executable, command.args, {
36359
+ detached: process3__default.default.platform !== "win32",
36360
+ stdio: "ignore"
36361
+ });
36362
+ child.once("error", reject);
36363
+ child.once("spawn", () => {
36364
+ child.unref();
36365
+ resolve4();
36366
+ });
36367
+ });
36368
+ }
36369
+ function resolveOpenBrowserCommand(url) {
36370
+ if (process3__default.default.platform === "darwin") {
36371
+ return {
36372
+ executable: "open",
36373
+ args: [url]
36374
+ };
36375
+ }
36376
+ if (process3__default.default.platform === "win32" || isWsl()) {
36377
+ return {
36378
+ executable: process3__default.default.platform === "win32" ? "cmd" : "cmd.exe",
36379
+ args: ["/c", "start", "", url]
36380
+ };
36381
+ }
36382
+ return {
36383
+ executable: "xdg-open",
36384
+ args: [url]
36385
+ };
36386
+ }
36387
+ function isWsl() {
36388
+ return process3__default.default.platform === "linux" && (process3__default.default.env.WSL_DISTRO_NAME !== void 0 || os__default.default.release().toLowerCase().includes("microsoft"));
36389
+ }
36390
+
36391
+ // src/cli/record.ts
36329
36392
  async function runOpensteerRecordCommand(input) {
36330
36393
  const stdout = input.stdout ?? process.stdout;
36331
36394
  const stderr = input.stderr ?? process.stderr;
@@ -36379,6 +36442,7 @@ async function runOpensteerRecordCommand(input) {
36379
36442
  async function runOpensteerCloudRecordCommand(input) {
36380
36443
  const stdout = input.stdout ?? process.stdout;
36381
36444
  const stderr = input.stderr ?? process.stderr;
36445
+ const cloudAppBaseUrl = requireCloudAppBaseUrl(input.cloudConfig);
36382
36446
  const outputPath = resolveRecordOutputPath({
36383
36447
  rootDir: input.rootDir,
36384
36448
  workspace: input.workspace,
@@ -36395,6 +36459,7 @@ async function runOpensteerCloudRecordCommand(input) {
36395
36459
  });
36396
36460
  const client = input.client ?? resolveCloud();
36397
36461
  const sleep5 = input.sleep ?? delay3;
36462
+ const openUrl = input.openUrl ?? openBrowserUrl;
36398
36463
  let closed = false;
36399
36464
  try {
36400
36465
  await runtime.open({
@@ -36404,8 +36469,13 @@ async function runOpensteerCloudRecordCommand(input) {
36404
36469
  ...input.context === void 0 ? {} : { context: input.context }
36405
36470
  });
36406
36471
  const sessionId = await resolveCloudRecordingSessionId(runtime);
36407
- const sessionUrl = buildCloudRecordingSessionUrl(input.cloudConfig, sessionId);
36472
+ const sessionUrl = buildCloudRecordingSessionUrl(cloudAppBaseUrl, sessionId);
36408
36473
  await client.startSessionRecording(sessionId);
36474
+ await tryOpenCloudRecordingSessionUrl({
36475
+ sessionUrl,
36476
+ stderr,
36477
+ openUrl
36478
+ });
36409
36479
  stderr.write(
36410
36480
  `Recording browser actions for workspace "${input.workspace}". Open ${sessionUrl} and click "Stop recording" in the browser session toolbar when you're done.
36411
36481
  `
@@ -36469,14 +36539,18 @@ function createRecorderRuntimeAdapter(runtime) {
36469
36539
  }
36470
36540
  };
36471
36541
  }
36472
- function buildCloudRecordingSessionUrl(cloudConfig, sessionId) {
36473
- const baseUrl = cloudConfig.appBaseUrl;
36474
- if (!baseUrl || baseUrl.trim().length === 0) {
36475
- throw new Error(
36476
- 'record with provider=cloud requires OPENSTEER_CLOUD_APP_BASE_URL or "--cloud-app-base-url".'
36542
+ function buildCloudRecordingSessionUrl(appBaseUrl, sessionId) {
36543
+ return `${appBaseUrl}/browsers/${encodeURIComponent(sessionId)}`;
36544
+ }
36545
+ async function tryOpenCloudRecordingSessionUrl(input) {
36546
+ try {
36547
+ await input.openUrl(input.sessionUrl);
36548
+ } catch {
36549
+ input.stderr.write(
36550
+ `Could not automatically open the cloud browser session. Open it manually: ${input.sessionUrl}
36551
+ `
36477
36552
  );
36478
36553
  }
36479
- return `${baseUrl.replace(/\/+$/, "")}/browsers/${encodeURIComponent(sessionId)}`;
36480
36554
  }
36481
36555
  async function resolveCloudRecordingSessionId(runtime) {
36482
36556
  const info = await runtime.info();
@@ -36590,7 +36664,7 @@ var OPERATION_ALIASES = /* @__PURE__ */ new Map([
36590
36664
  ["close", "session.close"]
36591
36665
  ]);
36592
36666
  async function main() {
36593
- const argv = process2__default.default.argv.slice(2);
36667
+ const argv = process3__default.default.argv.slice(2);
36594
36668
  const bootstrapAction = resolveCliBootstrapAction(argv);
36595
36669
  if (bootstrapAction === "version") {
36596
36670
  printVersion();
@@ -36600,7 +36674,7 @@ async function main() {
36600
36674
  printHelp();
36601
36675
  return;
36602
36676
  }
36603
- await loadCliEnvironment(process2__default.default.cwd());
36677
+ await loadCliEnvironment(process3__default.default.cwd());
36604
36678
  const parsed = parseCommandLine(argv);
36605
36679
  if (parsed.command[0] === "browser") {
36606
36680
  await handleBrowserCommand(parsed);
@@ -36617,7 +36691,7 @@ async function main() {
36617
36691
  list: parsed.options.list === true
36618
36692
  });
36619
36693
  if (exitCode !== 0) {
36620
- process2__default.default.exitCode = exitCode;
36694
+ process3__default.default.exitCode = exitCode;
36621
36695
  }
36622
36696
  return;
36623
36697
  }
@@ -36648,19 +36722,19 @@ async function main() {
36648
36722
  engine: engineName,
36649
36723
  runtimeOptions: {
36650
36724
  workspace: parsed.options.workspace,
36651
- rootDir: process2__default.default.cwd(),
36725
+ rootDir: process3__default.default.cwd(),
36652
36726
  browser: "persistent",
36653
36727
  ...parsed.options.launch === void 0 ? {} : { launch: parsed.options.launch },
36654
36728
  ...parsed.options.context === void 0 ? {} : { context: parsed.options.context }
36655
36729
  }
36656
36730
  });
36657
36731
  const result2 = await runtime2.close();
36658
- process2__default.default.stdout.write(`${JSON.stringify(result2, null, 2)}
36732
+ process3__default.default.stdout.write(`${JSON.stringify(result2, null, 2)}
36659
36733
  `);
36660
36734
  return;
36661
36735
  }
36662
36736
  const manager = new OpensteerBrowserManager({
36663
- rootDir: process2__default.default.cwd(),
36737
+ rootDir: process3__default.default.cwd(),
36664
36738
  workspace: parsed.options.workspace,
36665
36739
  engineName,
36666
36740
  browser: "persistent",
@@ -36668,7 +36742,7 @@ async function main() {
36668
36742
  ...parsed.options.context === void 0 ? {} : { context: parsed.options.context }
36669
36743
  });
36670
36744
  await manager.close();
36671
- process2__default.default.stdout.write(`${JSON.stringify({ closed: true }, null, 2)}
36745
+ process3__default.default.stdout.write(`${JSON.stringify({ closed: true }, null, 2)}
36672
36746
  `);
36673
36747
  return;
36674
36748
  }
@@ -36677,7 +36751,7 @@ async function main() {
36677
36751
  engine: engineName,
36678
36752
  runtimeOptions: {
36679
36753
  workspace: parsed.options.workspace,
36680
- rootDir: process2__default.default.cwd(),
36754
+ rootDir: process3__default.default.cwd(),
36681
36755
  ...parsed.options.browser === void 0 ? {} : { browser: parsed.options.browser },
36682
36756
  ...parsed.options.launch === void 0 ? {} : { launch: parsed.options.launch },
36683
36757
  ...parsed.options.context === void 0 ? {} : { context: parsed.options.context }
@@ -36696,7 +36770,7 @@ async function main() {
36696
36770
  } finally {
36697
36771
  await runtime.disconnect().catch(() => void 0);
36698
36772
  }
36699
- process2__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36773
+ process3__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36700
36774
  `);
36701
36775
  }
36702
36776
  async function handleBrowserCommand(parsed) {
@@ -36705,7 +36779,7 @@ async function handleBrowserCommand(parsed) {
36705
36779
  const result = await discoverLocalCdpBrowsers({
36706
36780
  ...parsed.options.launch?.timeoutMs === void 0 ? {} : { timeoutMs: parsed.options.launch.timeoutMs }
36707
36781
  });
36708
- process2__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36782
+ process3__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36709
36783
  `);
36710
36784
  return;
36711
36785
  }
@@ -36721,7 +36795,7 @@ async function handleBrowserCommand(parsed) {
36721
36795
  ...parsed.options.attachHeaders === void 0 ? {} : { headers: parsed.options.attachHeaders },
36722
36796
  ...parsed.options.launch?.timeoutMs === void 0 ? {} : { timeoutMs: parsed.options.launch.timeoutMs }
36723
36797
  });
36724
- process2__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36798
+ process3__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36725
36799
  `);
36726
36800
  return;
36727
36801
  }
@@ -36730,7 +36804,7 @@ async function handleBrowserCommand(parsed) {
36730
36804
  }
36731
36805
  const engineName = resolveCliEngineName(parsed);
36732
36806
  const manager = new OpensteerBrowserManager({
36733
- rootDir: process2__default.default.cwd(),
36807
+ rootDir: process3__default.default.cwd(),
36734
36808
  workspace: parsed.options.workspace,
36735
36809
  engineName,
36736
36810
  browser: "persistent",
@@ -36740,7 +36814,7 @@ async function handleBrowserCommand(parsed) {
36740
36814
  switch (subcommand) {
36741
36815
  case "status": {
36742
36816
  const result = await manager.status();
36743
- process2__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36817
+ process3__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36744
36818
  `);
36745
36819
  return;
36746
36820
  }
@@ -36753,19 +36827,19 @@ async function handleBrowserCommand(parsed) {
36753
36827
  sourceUserDataDir,
36754
36828
  ...parsed.options.sourceProfileDirectory === void 0 ? {} : { sourceProfileDirectory: parsed.options.sourceProfileDirectory }
36755
36829
  });
36756
- process2__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36830
+ process3__default.default.stdout.write(`${JSON.stringify(result, null, 2)}
36757
36831
  `);
36758
36832
  return;
36759
36833
  }
36760
36834
  case "reset": {
36761
36835
  await manager.reset();
36762
- process2__default.default.stdout.write(`${JSON.stringify({ reset: true }, null, 2)}
36836
+ process3__default.default.stdout.write(`${JSON.stringify({ reset: true }, null, 2)}
36763
36837
  `);
36764
36838
  return;
36765
36839
  }
36766
36840
  case "delete": {
36767
36841
  await manager.delete();
36768
- process2__default.default.stdout.write(`${JSON.stringify({ deleted: true }, null, 2)}
36842
+ process3__default.default.stdout.write(`${JSON.stringify({ deleted: true }, null, 2)}
36769
36843
  `);
36770
36844
  return;
36771
36845
  }
@@ -36787,7 +36861,7 @@ async function handleRecordCommandEntry(parsed) {
36787
36861
  if (engineName !== "playwright") {
36788
36862
  throw new Error("record requires engine=playwright.");
36789
36863
  }
36790
- const rootDir = process2__default.default.cwd();
36864
+ const rootDir = process3__default.default.cwd();
36791
36865
  const recordBrowser = parsed.options.browser;
36792
36866
  if (provider.mode === "cloud") {
36793
36867
  if (typeof recordBrowser === "object") {
@@ -36796,7 +36870,7 @@ async function handleRecordCommandEntry(parsed) {
36796
36870
  const runtimeProvider = buildCliRuntimeProvider(parsed, provider.mode);
36797
36871
  const runtimeConfig = resolveOpensteerRuntimeConfig({
36798
36872
  ...runtimeProvider === void 0 ? {} : { provider: runtimeProvider },
36799
- environment: process2__default.default.env
36873
+ environment: process3__default.default.env
36800
36874
  });
36801
36875
  await runOpensteerCloudRecordCommand({
36802
36876
  cloudConfig: runtimeConfig.cloud,
@@ -37176,14 +37250,14 @@ function buildCliExplicitProvider(parsed) {
37176
37250
  function resolveCliEngineName(parsed) {
37177
37251
  return resolveOpensteerEngineName({
37178
37252
  ...parsed.options.requestedEngineName === void 0 ? {} : { requested: parsed.options.requestedEngineName },
37179
- ...process2__default.default.env.OPENSTEER_ENGINE === void 0 ? {} : { environment: process2__default.default.env.OPENSTEER_ENGINE }
37253
+ ...process3__default.default.env.OPENSTEER_ENGINE === void 0 ? {} : { environment: process3__default.default.env.OPENSTEER_ENGINE }
37180
37254
  });
37181
37255
  }
37182
37256
  function resolveCliProvider(parsed) {
37183
37257
  const explicitProvider = buildCliExplicitProvider(parsed);
37184
37258
  return resolveOpensteerProvider({
37185
37259
  ...explicitProvider === void 0 ? {} : { provider: explicitProvider },
37186
- ...process2__default.default.env.OPENSTEER_PROVIDER === void 0 ? {} : { environmentProvider: process2__default.default.env.OPENSTEER_PROVIDER }
37260
+ ...process3__default.default.env.OPENSTEER_PROVIDER === void 0 ? {} : { environmentProvider: process3__default.default.env.OPENSTEER_PROVIDER }
37187
37261
  });
37188
37262
  }
37189
37263
  function buildCliRuntimeProvider(parsed, providerMode) {
@@ -37217,20 +37291,20 @@ async function handleStatusCommand(parsed) {
37217
37291
  const runtimeProvider = buildCliRuntimeProvider(parsed, provider.mode);
37218
37292
  const runtimeConfig = resolveOpensteerRuntimeConfig({
37219
37293
  ...runtimeProvider === void 0 ? {} : { provider: runtimeProvider },
37220
- environment: process2__default.default.env
37294
+ environment: process3__default.default.env
37221
37295
  });
37222
37296
  const status = await collectOpensteerStatus({
37223
- rootDir: process2__default.default.cwd(),
37297
+ rootDir: process3__default.default.cwd(),
37224
37298
  ...parsed.options.workspace === void 0 ? {} : { workspace: parsed.options.workspace },
37225
37299
  provider,
37226
37300
  ...runtimeConfig.cloud === void 0 ? {} : { cloudConfig: runtimeConfig.cloud }
37227
37301
  });
37228
37302
  if (parsed.options.json === true) {
37229
- process2__default.default.stdout.write(`${JSON.stringify(status, null, 2)}
37303
+ process3__default.default.stdout.write(`${JSON.stringify(status, null, 2)}
37230
37304
  `);
37231
37305
  return;
37232
37306
  }
37233
- process2__default.default.stdout.write(renderOpensteerStatus(status));
37307
+ process3__default.default.stdout.write(renderOpensteerStatus(status));
37234
37308
  }
37235
37309
  function parseKeyValueList(values) {
37236
37310
  if (values === void 0 || values.length === 0) {
@@ -37315,7 +37389,7 @@ function resolveCommandLength(tokens) {
37315
37389
  return Math.min(tokens.length, 1);
37316
37390
  }
37317
37391
  function printHelp() {
37318
- process2__default.default.stdout.write(`Opensteer v2 CLI
37392
+ process3__default.default.stdout.write(`Opensteer v2 CLI
37319
37393
 
37320
37394
  Usage:
37321
37395
  opensteer open <url> --workspace <id> [--browser persistent|temporary|attach]
@@ -37366,7 +37440,7 @@ Common options:
37366
37440
  `);
37367
37441
  }
37368
37442
  function printVersion() {
37369
- process2__default.default.stdout.write(`${package_default.version}
37443
+ process3__default.default.stdout.write(`${package_default.version}
37370
37444
  `);
37371
37445
  }
37372
37446
  main().catch((error) => {
@@ -37381,9 +37455,9 @@ main().catch((error) => {
37381
37455
  message: String(error)
37382
37456
  }
37383
37457
  };
37384
- process2__default.default.stderr.write(`${JSON.stringify(payload)}
37458
+ process3__default.default.stderr.write(`${JSON.stringify(payload)}
37385
37459
  `);
37386
- process2__default.default.exitCode = 1;
37460
+ process3__default.default.exitCode = 1;
37387
37461
  });
37388
37462
  //# sourceMappingURL=bin.cjs.map
37389
37463
  //# sourceMappingURL=bin.cjs.map