@opengeni/codemode 0.2.2 → 0.4.1

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.
@@ -1,8 +1,11 @@
1
1
  import { CodemodeClient, type CodemodeToolFunction } from "./index.js";
2
2
  export declare const CODEMODE_ENVIRONMENT: {
3
3
  readonly url: "OPENGENI_CODEMODE_URL";
4
+ readonly token: "OPENGENI_CODEMODE_TOKEN";
4
5
  readonly tokenFile: "OPENGENI_CODEMODE_TOKEN_FILE";
5
6
  };
7
+ /** Minimal environment shape; public declarations must not require `@types/node`. */
8
+ export type CodemodeEnvironment = Readonly<Record<string, string | undefined>>;
6
9
  export type CodemodeClientProvider = () => CodemodeClient | Promise<CodemodeClient>;
7
10
  /** A lazy catalog path. Every nested property remains callable at runtime. */
8
11
  export type CodemodeDynamicTool = CodemodeToolFunction & {
@@ -19,7 +22,7 @@ export type CodemodeToolsNamespace = CodemodeDynamicTools & CodemodeGeneratedToo
19
22
  * Build (or reuse) the persistent client for the exact sandbox attempt.
20
23
  * The bearer file is reread for every HTTP request so worker renewal is live.
21
24
  */
22
- export declare function environmentCodemodeClient(environment?: NodeJS.ProcessEnv): CodemodeClient;
25
+ export declare function environmentCodemodeClient(environment?: CodemodeEnvironment): CodemodeClient;
23
26
  /**
24
27
  * Lazy namespace used by ordinary sandbox programs:
25
28
  * `await tools.slack.search({ query: "..." })`.
package/dist/index.js CHANGED
@@ -20,19 +20,21 @@ import {
20
20
  import { readFile } from "fs/promises";
21
21
  var CODEMODE_ENVIRONMENT = {
22
22
  url: "OPENGENI_CODEMODE_URL",
23
+ token: "OPENGENI_CODEMODE_TOKEN",
23
24
  tokenFile: "OPENGENI_CODEMODE_TOKEN_FILE"
24
25
  };
25
26
  var cachedEnvironmentClient = null;
26
27
  function environmentCodemodeClient(environment = process.env) {
27
28
  const baseUrl = requiredEnvironment(environment, CODEMODE_ENVIRONMENT.url);
28
- const tokenFile = requiredEnvironment(environment, CODEMODE_ENVIRONMENT.tokenFile);
29
- const key = `${baseUrl}\0${tokenFile}`;
29
+ const directTokenConfigured = environment[CODEMODE_ENVIRONMENT.token] !== void 0;
30
+ const tokenFile = directTokenConfigured ? void 0 : requiredEnvironment(environment, CODEMODE_ENVIRONMENT.tokenFile);
31
+ const key = `${baseUrl}\0${directTokenConfigured ? "direct" : `file:${tokenFile}`}`;
30
32
  if (environment === process.env && cachedEnvironmentClient?.key === key) {
31
33
  return cachedEnvironmentClient.client;
32
34
  }
33
35
  const client = new CodemodeClient({
34
36
  baseUrl,
35
- token: async () => await readBearerFile(tokenFile)
37
+ token: directTokenConfigured ? async () => requiredEnvironment(environment, CODEMODE_ENVIRONMENT.token) : async () => await readBearerFile(tokenFile)
36
38
  });
37
39
  if (environment === process.env) cachedEnvironmentClient = { key, client };
38
40
  return client;
@@ -294,13 +296,17 @@ var PATH2 = {
294
296
  browserTabs: ["interaction", "browser", "tabs"],
295
297
  browserObserve: ["interaction", "browser", "observe"],
296
298
  browserAct: ["interaction", "browser", "act"],
299
+ browserClipboard: ["interaction", "browser", "clipboard"],
297
300
  browserDebug: ["interaction", "browser", "debug"],
301
+ browserAuth: ["interaction", "browser", "auth"],
302
+ requestHuman: ["interaction", "requestHuman"],
298
303
  browserIdentity: ["interaction", "browser", "identity"],
299
304
  browserPublish: ["interaction", "browser", "publish"],
300
305
  browserLifecycle: ["interaction", "browser", "lifecycle"],
301
306
  computerOpen: ["interaction", "computer", "open"],
302
307
  computerTargets: ["interaction", "computer", "targets"],
303
308
  computerObserve: ["interaction", "computer", "observe"],
309
+ computerClipboard: ["interaction", "computer", "clipboard"],
304
310
  computerAct: ["interaction", "computer", "act"],
305
311
  computerLifecycle: ["interaction", "computer", "lifecycle"]
306
312
  };
@@ -308,15 +314,20 @@ var OpenGeniCodemode = class {
308
314
  browsers;
309
315
  computers;
310
316
  artifacts;
317
+ auth;
311
318
  constructor(client = () => environmentCodemodeClient()) {
312
319
  const provider = codemodeClientProvider(client);
313
320
  this.browsers = new CodemodeBrowserCollection(provider);
314
321
  this.computers = new CodemodeComputerCollection(provider);
315
322
  this.artifacts = new CodemodeArtifactCollection(provider);
323
+ this.auth = new CodemodeAuth(provider);
316
324
  }
317
325
  async discover(options = {}, callOptions = {}) {
318
326
  return await callStructured(this.browsers.client, PATH2.discover, options, callOptions);
319
327
  }
328
+ async requestHuman(request, callOptions = {}) {
329
+ return await callStructured(this.browsers.client, PATH2.requestHuman, request, callOptions);
330
+ }
320
331
  };
321
332
  var CodemodeBrowserCollection = class {
322
333
  constructor(client) {
@@ -365,14 +376,27 @@ var CodemodeBrowserIdentityCollection = class {
365
376
  const response = await callStructured(this.client, PATH2.browserIdentity, { operation: "revisions", identityId }, callOptions);
366
377
  return response.result;
367
378
  }
379
+ async update(identityId, update, callOptions = {}) {
380
+ const response = await callStructured(
381
+ this.client,
382
+ PATH2.browserIdentity,
383
+ { operation: "update", identityId, ...update },
384
+ callOptions
385
+ );
386
+ return response.result;
387
+ }
368
388
  };
369
389
  var CodemodeBrowser = class {
370
390
  constructor(client, id) {
371
391
  this.client = client;
372
392
  this.id = id;
373
393
  this.tabs = new CodemodeBrowserTabCollection(client, id);
394
+ this.auth = new CodemodeBrowserAuth(client, id);
395
+ this.clipboard = new CodemodeBrowserClipboard(client, id, this.tabs);
374
396
  }
375
397
  tabs;
398
+ auth;
399
+ clipboard;
376
400
  async refresh(callOptions = {}) {
377
401
  const result = await callStructured(
378
402
  this.client,
@@ -427,6 +451,69 @@ var CodemodeBrowser = class {
427
451
  );
428
452
  }
429
453
  };
454
+ var CodemodeBrowserClipboard = class {
455
+ constructor(client, browserSessionId, tabs) {
456
+ this.client = client;
457
+ this.browserSessionId = browserSessionId;
458
+ this.tabs = tabs;
459
+ }
460
+ async read(callOptions = {}) {
461
+ return await callStructured(
462
+ this.client,
463
+ PATH2.browserClipboard,
464
+ { browserSessionId: this.browserSessionId },
465
+ callOptions
466
+ );
467
+ }
468
+ async write(text, options = {}, callOptions = {}) {
469
+ return await this.act({ type: "clipboard", operation: "write", text }, options, callOptions);
470
+ }
471
+ async clear(options = {}, callOptions = {}) {
472
+ return await this.act({ type: "clipboard", operation: "clear" }, options, callOptions);
473
+ }
474
+ async copy(options = {}, callOptions = {}) {
475
+ const {
476
+ targetId,
477
+ expectedTargetGeneration,
478
+ expectedDocumentGeneration,
479
+ expectedFrameId,
480
+ ...copy
481
+ } = options;
482
+ return await this.act(
483
+ { type: "clipboard", operation: "copy", ...copy },
484
+ {
485
+ targetId,
486
+ expectedTargetGeneration,
487
+ expectedDocumentGeneration,
488
+ expectedFrameId
489
+ },
490
+ callOptions
491
+ );
492
+ }
493
+ async paste(options = {}, callOptions = {}) {
494
+ const {
495
+ targetId,
496
+ expectedTargetGeneration,
497
+ expectedDocumentGeneration,
498
+ expectedFrameId,
499
+ ...paste
500
+ } = options;
501
+ return await this.act(
502
+ { type: "clipboard", operation: "paste", ...paste },
503
+ {
504
+ targetId,
505
+ expectedTargetGeneration,
506
+ expectedDocumentGeneration,
507
+ expectedFrameId
508
+ },
509
+ callOptions
510
+ );
511
+ }
512
+ async act(action, options, callOptions) {
513
+ const { targetId, ...fences } = options;
514
+ return await this.tabs.use(await this.tabs.resolveId(targetId, callOptions)).act(action, fences, callOptions);
515
+ }
516
+ };
430
517
  var CodemodeBrowserTabCollection = class {
431
518
  constructor(client, browserSessionId) {
432
519
  this.client = client;
@@ -523,6 +610,30 @@ var CodemodeBrowserTab = class {
523
610
  async navigate(url, callOptions = {}) {
524
611
  return await this.act({ type: "navigate", url }, {}, callOptions);
525
612
  }
613
+ async setPermission(permission, setting, fences = {}, callOptions = {}) {
614
+ return await this.act({ type: "permission", permission, setting }, fences, callOptions);
615
+ }
616
+ async requestHuman(reason, options = {}, callOptions = {}) {
617
+ const observation = await this.observe(callOptions);
618
+ return await callStructured(
619
+ this.client,
620
+ PATH2.requestHuman,
621
+ {
622
+ operation: "request",
623
+ resourceKind: "browser_session",
624
+ resourceId: this.browserSessionId,
625
+ targetId: this.id,
626
+ expectedControllerGeneration: observation.target.controllerGeneration,
627
+ expectedTargetGeneration: observation.target.targetGeneration,
628
+ expectedDocumentGeneration: observation.target.documentGeneration,
629
+ kind: options.kind ?? "other",
630
+ reason,
631
+ ...options.authRunId ? { authRunId: options.authRunId } : {},
632
+ ...options.expiresInSeconds === void 0 ? {} : { expiresInSeconds: options.expiresInSeconds }
633
+ },
634
+ callOptions
635
+ );
636
+ }
526
637
  getByRole(role, options = {}) {
527
638
  return new CodemodeBrowserLocator(this, { kind: "role", role, ...options });
528
639
  }
@@ -579,6 +690,147 @@ var CodemodeBrowserLocator = class {
579
690
  return await this.tab.act({ type: "check", locator: this.locator, checked }, {}, callOptions);
580
691
  }
581
692
  };
693
+ var CodemodeAuth = class {
694
+ constructor(client) {
695
+ this.client = client;
696
+ }
697
+ async listConnections(options = {}, callOptions = {}) {
698
+ const response = await callStructured(this.client, PATH2.browserAuth, { operation: "list_connections", ...options }, callOptions);
699
+ return response.result;
700
+ }
701
+ async getConnection(siteAuthConnectionId, callOptions = {}) {
702
+ const response = await callStructured(
703
+ this.client,
704
+ PATH2.browserAuth,
705
+ { operation: "get_connection", siteAuthConnectionId },
706
+ callOptions
707
+ );
708
+ return response.result;
709
+ }
710
+ async listRuns(options = {}, callOptions = {}) {
711
+ const response = await callStructured(
712
+ this.client,
713
+ PATH2.browserAuth,
714
+ { operation: "list_runs", ...options },
715
+ callOptions
716
+ );
717
+ return response.result;
718
+ }
719
+ async getRun(authRunId, callOptions = {}) {
720
+ const response = await callStructured(
721
+ this.client,
722
+ PATH2.browserAuth,
723
+ { operation: "get_run", authRunId },
724
+ callOptions
725
+ );
726
+ return response.result;
727
+ }
728
+ use(browserSessionId, authRunId) {
729
+ return new CodemodeAuthRun(this.client, browserSessionId, authRunId);
730
+ }
731
+ };
732
+ var CodemodeBrowserAuth = class {
733
+ constructor(client, browserSessionId) {
734
+ this.client = client;
735
+ this.browserSessionId = browserSessionId;
736
+ }
737
+ async listRuns(options = {}, callOptions = {}) {
738
+ const response = await callStructured(
739
+ this.client,
740
+ PATH2.browserAuth,
741
+ { operation: "list_runs", browserSessionId: this.browserSessionId, ...options },
742
+ callOptions
743
+ );
744
+ return response.result;
745
+ }
746
+ async start(request, callOptions = {}) {
747
+ const response = await callStructured(
748
+ this.client,
749
+ PATH2.browserAuth,
750
+ { operation: "start", browserSessionId: this.browserSessionId, ...request },
751
+ callOptions
752
+ );
753
+ return this.use(response.result.run.id);
754
+ }
755
+ use(authRunId) {
756
+ return new CodemodeAuthRun(this.client, this.browserSessionId, authRunId);
757
+ }
758
+ };
759
+ var CodemodeAuthRun = class {
760
+ constructor(client, browserSessionId, id) {
761
+ this.client = client;
762
+ this.browserSessionId = browserSessionId;
763
+ this.id = id;
764
+ }
765
+ async get(callOptions = {}) {
766
+ const response = await callStructured(
767
+ this.client,
768
+ PATH2.browserAuth,
769
+ { operation: "get_run", authRunId: this.id },
770
+ callOptions
771
+ );
772
+ if (response.result.browserSessionId !== this.browserSessionId) {
773
+ throw new Error("Auth run belongs to another BrowserSession");
774
+ }
775
+ return response.result;
776
+ }
777
+ async report(request, callOptions = {}) {
778
+ const response = await callStructured(
779
+ this.client,
780
+ PATH2.browserAuth,
781
+ {
782
+ operation: "report",
783
+ browserSessionId: this.browserSessionId,
784
+ authRunId: this.id,
785
+ ...request
786
+ },
787
+ callOptions
788
+ );
789
+ return response.result;
790
+ }
791
+ async protectedFill(request, callOptions = {}) {
792
+ const response = await callStructured(
793
+ this.client,
794
+ PATH2.browserAuth,
795
+ {
796
+ operation: "protected_fill",
797
+ browserSessionId: this.browserSessionId,
798
+ authRunId: this.id,
799
+ ...request
800
+ },
801
+ callOptions
802
+ );
803
+ return response.result;
804
+ }
805
+ async advanceExternal(request, callOptions = {}) {
806
+ const response = await callStructured(
807
+ this.client,
808
+ PATH2.browserAuth,
809
+ {
810
+ operation: "advance_external",
811
+ browserSessionId: this.browserSessionId,
812
+ authRunId: this.id,
813
+ ...request
814
+ },
815
+ callOptions
816
+ );
817
+ return response.result;
818
+ }
819
+ async verify(request, callOptions = {}) {
820
+ const response = await callStructured(
821
+ this.client,
822
+ PATH2.browserAuth,
823
+ {
824
+ operation: "verify",
825
+ browserSessionId: this.browserSessionId,
826
+ authRunId: this.id,
827
+ ...request
828
+ },
829
+ callOptions
830
+ );
831
+ return response.result;
832
+ }
833
+ };
582
834
  var CodemodeComputerCollection = class {
583
835
  constructor(client) {
584
836
  this.client = client;
@@ -605,9 +857,11 @@ var CodemodeComputer = class {
605
857
  this.id = id;
606
858
  this.targets = new CodemodeComputerTargetCollection(client, id);
607
859
  this.apps = this.targets;
860
+ this.clipboard = new CodemodeComputerClipboard(client, id, this.targets);
608
861
  }
609
862
  targets;
610
863
  apps;
864
+ clipboard;
611
865
  async refresh(callOptions = {}) {
612
866
  const result = await callStructured(
613
867
  this.client,
@@ -637,6 +891,37 @@ var CodemodeComputer = class {
637
891
  );
638
892
  }
639
893
  };
894
+ var CodemodeComputerClipboard = class {
895
+ constructor(client, computerSessionId, targets) {
896
+ this.client = client;
897
+ this.computerSessionId = computerSessionId;
898
+ this.targets = targets;
899
+ }
900
+ async read(callOptions = {}) {
901
+ return await callStructured(
902
+ this.client,
903
+ PATH2.computerClipboard,
904
+ { computerSessionId: this.computerSessionId },
905
+ callOptions
906
+ );
907
+ }
908
+ async write(text, options = {}, callOptions = {}) {
909
+ return await this.mutate({ type: "clipboard", operation: "write", text }, options, callOptions);
910
+ }
911
+ async clear(options = {}, callOptions = {}) {
912
+ return await this.mutate({ type: "clipboard", operation: "clear" }, options, callOptions);
913
+ }
914
+ async copy(options = {}, callOptions = {}) {
915
+ return await this.mutate({ type: "clipboard", operation: "copy" }, options, callOptions);
916
+ }
917
+ async paste(options = {}, callOptions = {}) {
918
+ return await this.mutate({ type: "clipboard", operation: "paste" }, options, callOptions);
919
+ }
920
+ async mutate(action, options, callOptions) {
921
+ const targetId = await this.targets.resolveSeatId(options.targetId, callOptions);
922
+ return await this.targets.use(targetId).act(action, {}, callOptions);
923
+ }
924
+ };
640
925
  var CodemodeComputerTargetCollection = class {
641
926
  constructor(client, computerSessionId) {
642
927
  this.client = client;
@@ -671,6 +956,13 @@ var CodemodeComputerTargetCollection = class {
671
956
  throw new Error("Computer has no app, window, or screen targets");
672
957
  throw new Error("Computer target is ambiguous; select an exact app or window");
673
958
  }
959
+ async resolveSeatId(targetId, callOptions) {
960
+ if (targetId) return await this.resolveId(targetId, callOptions);
961
+ const listed = await this.list(callOptions);
962
+ const screens = listed.targets.filter((target) => target.kind === "screen");
963
+ if (screens.length === 1) return screens[0].id;
964
+ return await this.resolveId(void 0, callOptions);
965
+ }
674
966
  };
675
967
  var CodemodeComputerTarget = class {
676
968
  constructor(client, computerSessionId, id) {
@@ -694,6 +986,26 @@ var CodemodeComputerTarget = class {
694
986
  callOptions
695
987
  );
696
988
  }
989
+ async requestHuman(reason, options = {}, callOptions = {}) {
990
+ const observation = await this.observe(callOptions);
991
+ return await callStructured(
992
+ this.client,
993
+ PATH2.requestHuman,
994
+ {
995
+ operation: "request",
996
+ resourceKind: "computer_session",
997
+ resourceId: this.computerSessionId,
998
+ targetId: this.id,
999
+ expectedControllerGeneration: observation.target.controllerGeneration,
1000
+ expectedTargetGeneration: observation.target.targetGeneration,
1001
+ expectedDocumentGeneration: null,
1002
+ kind: options.kind ?? "other",
1003
+ reason,
1004
+ ...options.expiresInSeconds === void 0 ? {} : { expiresInSeconds: options.expiresInSeconds }
1005
+ },
1006
+ callOptions
1007
+ );
1008
+ }
697
1009
  getByRole(role, options = {}) {
698
1010
  return new CodemodeComputerLocator(this, { kind: "role", role, ...options });
699
1011
  }
@@ -1501,7 +1813,11 @@ export {
1501
1813
  CodemodeArtifact,
1502
1814
  CodemodeArtifactCollection,
1503
1815
  CodemodeArtifactExport,
1816
+ CodemodeAuth,
1817
+ CodemodeAuthRun,
1504
1818
  CodemodeBrowser,
1819
+ CodemodeBrowserAuth,
1820
+ CodemodeBrowserClipboard,
1505
1821
  CodemodeBrowserCollection,
1506
1822
  CodemodeBrowserIdentityCollection,
1507
1823
  CodemodeBrowserLocator,
@@ -1509,6 +1825,7 @@ export {
1509
1825
  CodemodeBrowserTabCollection,
1510
1826
  CodemodeClient,
1511
1827
  CodemodeComputer,
1828
+ CodemodeComputerClipboard,
1512
1829
  CodemodeComputerCollection,
1513
1830
  CodemodeComputerLocator,
1514
1831
  CodemodeComputerTarget,