@skrr-ai/cli 0.1.75 → 0.1.76

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.
@@ -4,6 +4,7 @@ const core_1 = require("@oclif/core");
4
4
  const data_provider_1 = require("@skrr-ai/data-provider");
5
5
  const base_command_1 = require("../../../base-command");
6
6
  const github_oidc_1 = require("../../../lib/github-oidc");
7
+ const http_error_1 = require("../../../lib/http-error");
7
8
  /**
8
9
  * Publish a release from CI using GitHub OIDC trusted publishing (OSK-12311).
9
10
  *
@@ -84,6 +85,21 @@ class AgentsReleasesCiPublish extends base_command_1.BaseCommand {
84
85
  });
85
86
  }
86
87
  catch (err) {
88
+ const body = (0, http_error_1.httpBodyOf)(err);
89
+ if ((0, http_error_1.httpStatusOf)(err) === 401 && body?.code === 'CI_OIDC_TOKEN_INVALID') {
90
+ const reason = typeof body.error === 'string' ? body.error : 'OIDC token was rejected';
91
+ const requestId = err instanceof Error ? err.requestId : undefined;
92
+ this.failWithCliError({
93
+ message: `${reason}. Request a fresh GitHub Actions OIDC token with ` +
94
+ '`permissions: id-token: write` and the expected audience.',
95
+ code: 'CI_OIDC_TOKEN_INVALID',
96
+ status: 401,
97
+ exit: 2,
98
+ retryable: false,
99
+ details: body,
100
+ requestId: typeof requestId === 'string' ? requestId : undefined,
101
+ });
102
+ }
87
103
  this.handleApiError(err);
88
104
  }
89
105
  if (flags.json) {
@@ -6,12 +6,12 @@ const base_command_1 = require("../../base-command");
6
6
  const prompt_1 = require("../../lib/prompt");
7
7
  /**
8
8
  * One line per placement, said the same way the web install rail says it: the
9
- * difference is whether a stranger's instructions get this computer's shell,
10
- * files and browser.
9
+ * difference is whether a stranger's instructions may reach a connected
10
+ * machine in the buyer's account. The model loop stays on Agent Worker.
11
11
  */
12
12
  const PLACEMENT_NOTE = {
13
- cloud: "It runs in the cloud, so its tools do not reach this computer. You can change that in the agent's Runtime settings.",
14
- local: 'It may use tools on your own computer (shell, files, browser) whenever your daemon is connected.',
13
+ cloud: "It runs in the cloud, so its tools cannot reach your connected machines. You can change that in the agent's Runtime settings.",
14
+ local: 'It still runs in the cloud. Its tools may use the shell, files and browser on an available connected machine in your account, selected when the agent runs.',
15
15
  };
16
16
  class StoreInstall extends base_command_1.BaseCommand {
17
17
  static description = 'Install a published agent — you get your own copy of it. A paid agent shows its price and refund terms and asks you to confirm first.';
@@ -44,8 +44,8 @@ class StoreInstall extends base_command_1.BaseCommand {
44
44
  description: 'Confirm a paid purchase without prompting. The price and refund terms are still printed.',
45
45
  }),
46
46
  'run-on': core_1.Flags.string({
47
- description: 'Where the copy runs. cloud (the default) keeps its tools off this computer; ' +
48
- 'local lets it use your shell, files and browser when your daemon is connected',
47
+ description: 'Where its tools may run. cloud (the default) keeps tools off connected machines; ' +
48
+ 'local lets tools use an available connected machine in your account, selected at run time. The agent runs in the cloud either way',
49
49
  options: [...data_provider_1.STORE_INSTALL_EXECUTION_PLACEMENTS],
50
50
  }),
51
51
  'share-outcomes': core_1.Flags.boolean({