@skrr-ai/cli 0.1.8 → 0.1.10

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 (170) hide show
  1. package/dist/base-command.d.ts +27 -0
  2. package/dist/base-command.js +83 -11
  3. package/dist/commands/agent/message/send.js +1 -1
  4. package/dist/commands/agents/chat.d.ts +1 -1
  5. package/dist/commands/agents/chat.js +1 -1
  6. package/dist/commands/browser/install.d.ts +1 -1
  7. package/dist/commands/browser/install.js +10 -2
  8. package/dist/commands/browser/mcp-config.js +3 -1
  9. package/dist/commands/browser/skill/show.js +1 -1
  10. package/dist/commands/browser/status.js +4 -1
  11. package/dist/commands/browser/uninstall.d.ts +1 -1
  12. package/dist/commands/browser/uninstall.js +10 -2
  13. package/dist/commands/browser.d.ts +1 -1
  14. package/dist/commands/browser.js +3 -3
  15. package/dist/commands/code/index.js +6 -3
  16. package/dist/commands/code/install.d.ts +61 -0
  17. package/dist/commands/code/install.js +247 -0
  18. package/dist/commands/code/oversky-agent.d.ts +2 -1
  19. package/dist/commands/code/oversky-agent.js +12 -8
  20. package/dist/commands/commands.js +1 -1
  21. package/dist/commands/context.js +1 -1
  22. package/dist/commands/create-token.js +1 -1
  23. package/dist/commands/daemon/byok.d.ts +1 -0
  24. package/dist/commands/daemon/byok.js +14 -1
  25. package/dist/commands/daemon/index.js +18 -7
  26. package/dist/commands/daemon/install.d.ts +1 -0
  27. package/dist/commands/daemon/install.js +22 -3
  28. package/dist/commands/daemon/logs.d.ts +1 -0
  29. package/dist/commands/daemon/logs.js +4 -0
  30. package/dist/commands/daemon/start.d.ts +1 -0
  31. package/dist/commands/daemon/start.js +15 -2
  32. package/dist/commands/daemon/status.d.ts +1 -0
  33. package/dist/commands/daemon/status.js +14 -1
  34. package/dist/commands/daemon/stop.d.ts +1 -0
  35. package/dist/commands/daemon/stop.js +14 -1
  36. package/dist/commands/daemon/uninstall.d.ts +1 -0
  37. package/dist/commands/daemon/uninstall.js +15 -2
  38. package/dist/commands/daemon/usage.d.ts +1 -0
  39. package/dist/commands/daemon/usage.js +5 -1
  40. package/dist/commands/doctor.js +2 -2
  41. package/dist/commands/github/allow-tools.d.ts +1 -0
  42. package/dist/commands/github/app/install.d.ts +1 -0
  43. package/dist/commands/github/app/status.d.ts +1 -0
  44. package/dist/commands/github/connect.d.ts +1 -0
  45. package/dist/commands/github/connections.d.ts +1 -0
  46. package/dist/commands/github/disconnect.d.ts +1 -0
  47. package/dist/commands/github/finalize.d.ts +1 -0
  48. package/dist/commands/github/reconnect.d.ts +1 -0
  49. package/dist/commands/github/run.d.ts +1 -0
  50. package/dist/commands/github/tools.d.ts +1 -0
  51. package/dist/commands/goals/create.js +2 -2
  52. package/dist/commands/goals/show.js +5 -0
  53. package/dist/commands/harnesses/list.js +14 -3
  54. package/dist/commands/harnesses/show.js +14 -0
  55. package/dist/commands/instructions/activate.js +1 -1
  56. package/dist/commands/instructions/archive-version.js +1 -1
  57. package/dist/commands/instructions/delete.js +1 -1
  58. package/dist/commands/instructions/diff.js +1 -1
  59. package/dist/commands/instructions/install.js +7 -1
  60. package/dist/commands/instructions/restore.js +1 -1
  61. package/dist/commands/instructions/show.js +17 -1
  62. package/dist/commands/instructions/update.js +1 -1
  63. package/dist/commands/integrations/connections/connect.d.ts +1 -0
  64. package/dist/commands/integrations/connections/disconnect.d.ts +1 -0
  65. package/dist/commands/integrations/connections/finalize.d.ts +1 -0
  66. package/dist/commands/integrations/connections/list.d.ts +1 -0
  67. package/dist/commands/integrations/connections/reconnect.d.ts +1 -0
  68. package/dist/commands/integrations/execute.d.ts +1 -0
  69. package/dist/commands/integrations/search.d.ts +1 -0
  70. package/dist/commands/integrations/toolkits.d.ts +1 -0
  71. package/dist/commands/integrations/tools/allow.d.ts +1 -0
  72. package/dist/commands/integrations/tools/list.d.ts +1 -0
  73. package/dist/commands/list-daemons.d.ts +2 -7
  74. package/dist/commands/list-daemons.js +13 -13
  75. package/dist/commands/login.js +78 -33
  76. package/dist/commands/logout.js +52 -1
  77. package/dist/commands/machines/hosted/start.js +1 -1
  78. package/dist/commands/pair.js +2 -2
  79. package/dist/commands/projects/create.js +6 -1
  80. package/dist/commands/projects/tasks.js +6 -1
  81. package/dist/commands/revoke-daemon.js +6 -2
  82. package/dist/commands/set-capabilities.js +6 -2
  83. package/dist/commands/skills/install.js +1 -1
  84. package/dist/commands/skills/library.js +2 -2
  85. package/dist/commands/spaces/create.js +6 -2
  86. package/dist/commands/tasks/complete.d.ts +1 -1
  87. package/dist/commands/tasks/complete.js +21 -8
  88. package/dist/commands/tasks/create.js +4 -1
  89. package/dist/commands/tasks/current.js +1 -1
  90. package/dist/commands/tasks/delete.d.ts +1 -0
  91. package/dist/commands/tasks/delete.js +9 -0
  92. package/dist/commands/tasks/export.js +5 -1
  93. package/dist/commands/tasks/follow-up.js +2 -1
  94. package/dist/commands/tasks/list.js +5 -1
  95. package/dist/commands/tasks/pr.js +1 -1
  96. package/dist/commands/tasks/show.js +10 -1
  97. package/dist/commands/tasks/triage.js +2 -1
  98. package/dist/commands/tasks/update.js +4 -1
  99. package/dist/commands/tasks/upsert.js +4 -1
  100. package/dist/commands/usage.js +1 -1
  101. package/dist/commands/whoami.js +4 -1
  102. package/dist/lib/agentic-stream.js +21 -1
  103. package/dist/lib/api-fetch.d.ts +1 -1
  104. package/dist/lib/api-fetch.js +1 -1
  105. package/dist/lib/auth-core-init.js +23 -3
  106. package/dist/lib/auth-storage.d.ts +0 -12
  107. package/dist/lib/auth-storage.js +37 -2
  108. package/dist/lib/config.d.ts +43 -3
  109. package/dist/lib/config.js +391 -31
  110. package/dist/lib/created-line.d.ts +22 -0
  111. package/dist/lib/created-line.js +25 -0
  112. package/dist/lib/daemon-binding.d.ts +29 -0
  113. package/dist/lib/daemon-binding.js +63 -0
  114. package/dist/lib/daemon-ref.d.ts +31 -0
  115. package/dist/lib/daemon-ref.js +47 -0
  116. package/dist/lib/daemonBroker.js +1 -1
  117. package/dist/lib/delegated-cli.js +3 -3
  118. package/dist/lib/exec-oversky.d.ts +18 -1
  119. package/dist/lib/exec-oversky.js +21 -4
  120. package/dist/lib/html-text.d.ts +15 -0
  121. package/dist/lib/html-text.js +40 -0
  122. package/dist/lib/keychain.d.ts +43 -0
  123. package/dist/lib/keychain.js +145 -4
  124. package/dist/lib/login.js +3 -3
  125. package/dist/lib/node-adapter.js +1 -1
  126. package/dist/lib/oauthLogin.js +17 -6
  127. package/dist/lib/sky-code-agent.d.ts +1 -1
  128. package/dist/lib/sky-code-agent.js +8 -8
  129. package/dist/lib/sky-code-broker.js +18 -2
  130. package/dist/lib/sky-code-doctor.js +120 -4
  131. package/dist/lib/sky-code-managed.d.ts +12 -0
  132. package/dist/lib/sky-code-managed.js +21 -7
  133. package/dist/lib/sky-code.d.ts +16 -1
  134. package/dist/lib/sky-code.js +110 -7
  135. package/dist/lib/task-execution.js +4 -11
  136. package/dist/lib/tasks.d.ts +1 -0
  137. package/dist/lib/tasks.js +9 -6
  138. package/dist/lib/update-check.js +1 -1
  139. package/dist/lib/usage-discovery.js +1 -1
  140. package/dist/lib/web-url.js +12 -1
  141. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/credentialResolver.d.ts +1 -1
  142. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/credentialResolver.js +2 -2
  143. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +1 -0
  144. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +13 -1
  145. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/kek/linux.js +16 -3
  146. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/legacyStatePreflight.d.ts +0 -9
  147. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/legacyStatePreflight.js +18 -1
  148. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/loginLocalhost.js +3 -3
  149. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +3 -3
  150. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/runtime.d.ts +7 -3
  151. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/skyCodeChannels.d.ts +96 -0
  152. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/skyCodeChannels.js +115 -0
  153. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/credentialResolver.d.ts +1 -1
  154. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/credentialResolver.js +2 -2
  155. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +1 -0
  156. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -0
  157. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/kek/linux.js +16 -3
  158. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/legacyStatePreflight.d.ts +0 -9
  159. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/legacyStatePreflight.js +18 -1
  160. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/loginLocalhost.js +3 -3
  161. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +3 -3
  162. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/runtime.d.ts +7 -3
  163. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/skyCodeChannels.d.ts +96 -0
  164. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/skyCodeChannels.js +107 -0
  165. package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
  166. package/dist/node_modules/@skrr-ai/data-provider/index.js +4206 -4191
  167. package/dist/node_modules/@skrr-ai/inference-broker/dist/cjs/managed-inference-broker.js +2 -2
  168. package/dist/node_modules/@skrr-ai/inference-broker/dist/esm/managed-inference-broker.js +2 -2
  169. package/oclif.manifest.json +7969 -1397
  170. package/package.json +22 -19
@@ -239,7 +239,7 @@ async function acquireManagedSession(input = {}, deps = {}) {
239
239
  if (agent.createdNow) {
240
240
  input.log?.(`Created "${agent.name ?? agent.id}" as your default skrr Code agent — ` +
241
241
  'this session, and future ones, are attributed to it. ' +
242
- 'Change it with `skrr code oversky-agent --set <id-or-name>`.');
242
+ 'Change it with `skrr code skrr-agent --set <id-or-name>`.');
243
243
  }
244
244
  const minted = await mintSessionToken({ sessionId, processStartId, agentId: agent.id, actorId: newId() }, api, acquisition.signal);
245
245
  sessionToken = minted.token;
@@ -888,11 +888,27 @@ function describe(err) {
888
888
  *
889
889
  * The predicate is `hasProviderCredential`, the same one that decides what the
890
890
  * engine actually inherits (`sky-code.ts`), so the sentence and the spawn cannot
891
- * disagree.
891
+ * disagree. `strippedProviderCredentialNames` covers the third case that
892
+ * predicate cannot see: the machine HAS a provider credential and this run
893
+ * removes it, which reads as absence and is not.
892
894
  */
893
895
  function fallbackTail(env) {
894
896
  if ((0, sky_code_1.hasProviderCredential)(env))
895
897
  return 'Continuing with your own provider credentials.';
898
+ // Absence and removal are different problems, and the old sentence said the
899
+ // first when the second was true: on a machine whose only credential is an AWS
900
+ // profile the engine runs fine on its own and fails through `skrr code`,
901
+ // because `AWS_*` is stripped on the way in. Being told "no provider
902
+ // credential is set here" sends that user to buy a key they do not need.
903
+ const stripped = (0, sky_code_1.strippedProviderCredentialNames)(env);
904
+ if (stripped.length > 0) {
905
+ return (`${stripped.join(', ')} is set here, but this run does not pass it to the engine — ` +
906
+ 'it is stripped so a model-driven process opening other people\u2019s repositories cannot ' +
907
+ 'reuse a cloud credential. So the engine starts without one and its first request will ' +
908
+ 'fail. Export a provider key the engine may inherit (any `*_API_KEY`, e.g. ' +
909
+ 'OPENROUTER_API_KEY), resolve the reason above, or run the engine directly if you ' +
910
+ 'intend to spend that credential (`skrr code doctor` shows where it is).');
911
+ }
896
912
  return ('No provider credential is set here either, so the engine will start without one and ' +
897
913
  'its first request will fail — set OPENROUTER_API_KEY, or resolve the reason above ' +
898
914
  '(`skrr code doctor`).');
@@ -32,6 +32,7 @@ exports.formatReport = formatReport;
32
32
  const node_fs_1 = require("node:fs");
33
33
  const node_path_1 = __importDefault(require("node:path"));
34
34
  const sky_code_1 = require("./sky-code");
35
+ const auth_core_1 = require("@skrr-ai/auth-core");
35
36
  const harness_tiers_1 = require("./harness-tiers");
36
37
  const config_1 = require("./config");
37
38
  const sky_code_managed_1 = require("./sky-code-managed");
@@ -39,10 +40,124 @@ const sky_code_managed_1 = require("./sky-code-managed");
39
40
  function projectStateDir(cwd) {
40
41
  return node_path_1.default.join(node_path_1.default.resolve(cwd), '.sky-code');
41
42
  }
43
+ /**
44
+ * Which release channel this machine follows, and where its manifest lives.
45
+ *
46
+ * `notInstalledMessage()` has always ended by promising that this command names
47
+ * "which channel this machine follows and whether that channel has a published
48
+ * release", and nothing here knew what a channel was — the whole vocabulary sat
49
+ * in `daemon/src/sky-code/channels.ts`, whose only importer was the daemon's own
50
+ * installer. So the user with no engine, who is exactly the audience for that
51
+ * sentence, was sent to a command that could not answer (dogfood OSK-274).
52
+ *
53
+ * It reports the channel and the exact URL, and does NOT fetch it. The doctor is
54
+ * documented as safe to run in any context and reads only env, config and one
55
+ * `existsSync`; adding a network call to satisfy a sentence would trade a broken
56
+ * promise for a diagnostic that hangs on a captive portal. Printing the URL puts
57
+ * the answer one copy-paste away and keeps the property — and the promise is
58
+ * reworded to match what is delivered rather than the other way round.
59
+ *
60
+ * `warn` on an unrecognised channel, because `resolveSkyCodeChannel` falls back
61
+ * to the default rather than throwing: a typo must not brick updates, and a
62
+ * silent fallback must not look like agreement.
63
+ */
64
+ function releaseChannelCheck(env) {
65
+ const { channel, invalid } = (0, auth_core_1.resolveSkyCodeChannel)(env);
66
+ const url = (0, auth_core_1.resolveChannelManifestUrl)({
67
+ base: (0, auth_core_1.skyCodeFeedBase)(env),
68
+ manifestFilename: auth_core_1.SKY_CODE_MANIFEST_FILE,
69
+ channel,
70
+ });
71
+ if (invalid) {
72
+ return {
73
+ name: 'release-channel',
74
+ status: 'warn',
75
+ detail: `${auth_core_1.SKY_CODE_CHANNEL_ENV}='${invalid}' is not a channel; following '${channel}' instead — ${url}`,
76
+ remedy: `Set ${auth_core_1.SKY_CODE_CHANNEL_ENV} to one of internal, canary, beta, stable, or unset it to follow the default.`,
77
+ };
78
+ }
79
+ return {
80
+ name: 'release-channel',
81
+ status: 'ok',
82
+ detail: `${channel} — ${url}`,
83
+ remedy: `Fetch that URL to see whether the channel has a published release, and which version.`,
84
+ };
85
+ }
86
+ /**
87
+ * What the pre-rename engine directory still holds, for a machine that has moved on.
88
+ *
89
+ * Round 1 gave both readers a fallback to `~/.oversky/sky-code/bin` so nothing
90
+ * BREAKS on a machine that installed before the rename. Nothing was given the job
91
+ * of finishing the move: no installer sweep, and — once the current root wins —
92
+ * no mention anywhere. This machine converged on two engine directories and
93
+ * reported one, the older holding 713 MB across six binaries (dogfood OSK-278).
94
+ *
95
+ * Flat, never recursive, and failures are swallowed: this is a footnote on a
96
+ * diagnostic, and a doctor that throws while counting bytes it was only going to
97
+ * mention has made things worse than the clutter it was reporting.
98
+ */
99
+ function strandedLegacyEngine(env) {
100
+ const exeName = process.platform === 'win32' ? 'sky-code.exe' : 'sky-code';
101
+ const legacy = (0, sky_code_1.legacyManagedEnginePath)(exeName, env);
102
+ if (!legacy)
103
+ return null;
104
+ const dir = node_path_1.default.dirname(legacy);
105
+ try {
106
+ const entries = (0, node_fs_1.readdirSync)(dir);
107
+ let bytes = 0;
108
+ let files = 0;
109
+ for (const entry of entries) {
110
+ const stats = (0, node_fs_1.statSync)(node_path_1.default.join(dir, entry));
111
+ if (!stats.isFile())
112
+ continue;
113
+ files += 1;
114
+ bytes += stats.size;
115
+ }
116
+ return files > 0 ? { dir, files, bytes } : null;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /** Bytes as the size a human would say out loud. */
123
+ function humanBytes(bytes) {
124
+ const mb = bytes / 1024 / 1024;
125
+ return mb >= 1024 ? `${(mb / 1024).toFixed(1)} GB` : `${Math.round(mb)} MB`;
126
+ }
42
127
  function engineCheck(env) {
43
128
  const { path: bin, source } = (0, sky_code_1.resolveEngine)(env);
129
+ if (bin && source === 'legacy-managed') {
130
+ // `ok`, because it runs and this is the resolution the daemon has always
131
+ // made. The remedy is here because the resolution is SURPRISING: the path
132
+ // says `.oversky` on a CLI that says `skrr` everywhere else, and the next
133
+ // daemon-driven install will write to `~/.skrr` and leave two copies of a
134
+ // hundred-megabyte binary on disk with no hint which one is live.
135
+ return {
136
+ name: 'engine',
137
+ status: 'ok',
138
+ detail: `${bin} (resolved via ${source} — the pre-rename location)`,
139
+ remedy: 'It works, and nothing has to change today. Installing the engine again ' +
140
+ `through the daemon writes it to ${(0, sky_code_1.managedEnginePath)('sky-code', env)}; ` +
141
+ 'the copy above can be deleted once it does.',
142
+ };
143
+ }
44
144
  if (bin) {
45
- return { name: 'engine', status: 'ok', detail: `${bin} (resolved via ${source})` };
145
+ // The engine resolved from the current root and the pre-rename directory
146
+ // may still be sitting there. Said here rather than in its own check because
147
+ // it is a footnote on a healthy answer, not a finding of its own.
148
+ const stranded = strandedLegacyEngine(env);
149
+ return {
150
+ name: 'engine',
151
+ status: 'ok',
152
+ detail: `${bin} (resolved via ${source})`,
153
+ ...(stranded
154
+ ? {
155
+ remedy: `${stranded.dir} still holds ${stranded.files} file(s), ${humanBytes(stranded.bytes)}, ` +
156
+ 'from before the config root moved. Nothing reads it now that the engine above ' +
157
+ 'resolves, and nothing removes it either — delete it when you want the space back.',
158
+ }
159
+ : {}),
160
+ };
46
161
  }
47
162
  const override = env[sky_code_1.ENGINE_PATH_ENV];
48
163
  if (override && !node_path_1.default.isAbsolute(override)) {
@@ -461,7 +576,7 @@ function sessionAuthorityCheck(env) {
461
576
  remedy: 'Intended for local use, and nothing to fix. Worth knowing because it is NOT the same ' +
462
577
  'trust plane as a daemon-dispatched run — and neither plane is an OS-level sandbox ' +
463
578
  '(no seccomp, container, or namespace). An untrusted autonomous workload needs a hosted ' +
464
- 'or container profile; see the fork’s docs/sky-code/threat-model.md.',
579
+ 'or container profile; see sky-code/docs/sky-code/threat-model.md.',
465
580
  };
466
581
  }
467
582
  }
@@ -473,7 +588,7 @@ function sessionAuthorityCheck(env) {
473
588
  * a `/api/agents` read, and this module's whole contract is that it answers from
474
589
  * env, one config read and one `existsSync` — that is what lets `skrr code doctor`
475
590
  * run before the auth plane is configured, and on a machine with no network.
476
- * `skrr code oversky-agent` is the command that resolves for real.
591
+ * `skrr code skrr-agent` is the command that resolves for real.
477
592
  *
478
593
  * Never a `warn`. An unset value is the normal, supported state now that
479
594
  * resolution ends in a default agent rather than a refusal; flagging it would
@@ -507,12 +622,13 @@ function agentAttributionCheck() {
507
622
  name: 'agent',
508
623
  status: 'ok',
509
624
  detail: `no ${sky_code_managed_1.AGENT_CONFIG_KEY} set — sessions use your sole owned agent, else your default ${sky_code_managed_1.SKY_CODE_HARNESS} agent`,
510
- remedy: 'Run `skrr code oversky-agent` to see which, or `skrr code oversky-agent --set <id>` to pin one.',
625
+ remedy: 'Run `skrr code skrr-agent` to see which, or `skrr code skrr-agent --set <id>` to pin one.',
511
626
  };
512
627
  }
513
628
  function runDoctor(cwd = process.cwd(), env = process.env) {
514
629
  const checks = [
515
630
  engineCheck(env),
631
+ releaseChannelCheck(env),
516
632
  stateDirCheck(cwd, env),
517
633
  compatCheck(cwd, env),
518
634
  opencodeCheck(cwd),
@@ -46,7 +46,19 @@ export declare const MANAGED_ENV_FLAG = "OVERSKY_SKY_CODE_MANAGED";
46
46
  * `skrr code --agent reviewer` is the engine's flag and is pinned as such by
47
47
  * `sky-code-passthrough.spec.ts`. A bare `--agent` here would steal it.
48
48
  */
49
+ export declare const SKRR_AGENT_FLAG = "--skrr-agent";
50
+ /**
51
+ * The pre-rename spelling, still accepted.
52
+ *
53
+ * It is in muscle memory and in scripts, and `skrr code` forwards argv verbatim
54
+ * — so a flag this CLI stops recognising is not an error, it is silently handed
55
+ * to the engine, which rejects it with a message about a flag the user did not
56
+ * think they were passing. Accepting both is the only version of this rename
57
+ * that fails safely.
58
+ */
49
59
  export declare const OVERSKY_AGENT_FLAG = "--oversky-agent";
60
+ /** Every spelling the argv scanner honours, primary first. */
61
+ export declare const AGENT_FLAG_SPELLINGS: readonly ["--skrr-agent", "--oversky-agent"];
50
62
  /** The config key `skrr code` reads when the flag is absent. */
51
63
  export declare const AGENT_CONFIG_KEY = "skyCodeAgentId";
52
64
  /**
@@ -32,7 +32,7 @@
32
32
  * reason: the user is about to spend their own key and must know it.
33
33
  */
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.BROKER_SOCKET_ENV = exports.MANAGED_SESSION_ENV = exports.SKY_CODE_HARNESS = exports.AGENT_CONFIG_KEY = exports.OVERSKY_AGENT_FLAG = exports.MANAGED_ENV_FLAG = void 0;
35
+ exports.BROKER_SOCKET_ENV = exports.MANAGED_SESSION_ENV = exports.SKY_CODE_HARNESS = exports.AGENT_CONFIG_KEY = exports.AGENT_FLAG_SPELLINGS = exports.OVERSKY_AGENT_FLAG = exports.SKRR_AGENT_FLAG = exports.MANAGED_ENV_FLAG = void 0;
36
36
  exports.resolveTrustPlane = resolveTrustPlane;
37
37
  exports.skyCodeServerUrl = skyCodeServerUrl;
38
38
  exports.managedSkipReason = managedSkipReason;
@@ -59,7 +59,19 @@ exports.MANAGED_ENV_FLAG = 'OVERSKY_SKY_CODE_MANAGED';
59
59
  * `skrr code --agent reviewer` is the engine's flag and is pinned as such by
60
60
  * `sky-code-passthrough.spec.ts`. A bare `--agent` here would steal it.
61
61
  */
62
+ exports.SKRR_AGENT_FLAG = '--skrr-agent';
63
+ /**
64
+ * The pre-rename spelling, still accepted.
65
+ *
66
+ * It is in muscle memory and in scripts, and `skrr code` forwards argv verbatim
67
+ * — so a flag this CLI stops recognising is not an error, it is silently handed
68
+ * to the engine, which rejects it with a message about a flag the user did not
69
+ * think they were passing. Accepting both is the only version of this rename
70
+ * that fails safely.
71
+ */
62
72
  exports.OVERSKY_AGENT_FLAG = '--oversky-agent';
73
+ /** Every spelling the argv scanner honours, primary first. */
74
+ exports.AGENT_FLAG_SPELLINGS = [exports.SKRR_AGENT_FLAG, exports.OVERSKY_AGENT_FLAG];
63
75
  /** The config key `skrr code` reads when the flag is absent. */
64
76
  exports.AGENT_CONFIG_KEY = 'skyCodeAgentId';
65
77
  /**
@@ -238,19 +250,21 @@ function takeOverskyAgentFlag(passthrough) {
238
250
  let agentRef;
239
251
  for (let i = 0; i < passthrough.length; i += 1) {
240
252
  const token = passthrough[i];
241
- if (token === exports.OVERSKY_AGENT_FLAG) {
242
- // Last one wins, matching how every argv parser treats a repeated flag.
253
+ if (exports.AGENT_FLAG_SPELLINGS.includes(token)) {
254
+ // Last one wins, matching how every argv parser treats a repeated flag
255
+ // and across spellings too, so `--oversky-agent a --skrr-agent b` is `b`.
243
256
  const value = passthrough[i + 1];
244
- // A trailing `--oversky-agent` with no value must not swallow the next
245
- // token (there is none) nor leave the flag in the argv.
257
+ // A trailing flag with no value must not swallow the next token (there is
258
+ // none) nor leave the flag in the argv.
246
259
  if (value !== undefined && !value.startsWith('-')) {
247
260
  agentRef = value;
248
261
  i += 1;
249
262
  }
250
263
  continue;
251
264
  }
252
- if (token.startsWith(`${exports.OVERSKY_AGENT_FLAG}=`)) {
253
- agentRef = token.slice(exports.OVERSKY_AGENT_FLAG.length + 1);
265
+ const inline = exports.AGENT_FLAG_SPELLINGS.find((f) => token.startsWith(`${f}=`));
266
+ if (inline) {
267
+ agentRef = token.slice(inline.length + 1);
254
268
  continue;
255
269
  }
256
270
  engineArgv.push(token);
@@ -31,9 +31,23 @@ export declare function skyCodeInstructionHome(env?: NodeJS.ProcessEnv): string;
31
31
  * `scripts/sky-code/build.mjs --install` all put the engine.
32
32
  */
33
33
  export declare function managedEnginePath(exeName: string, env?: NodeJS.ProcessEnv): string;
34
+ /**
35
+ * The same managed location under the PREVIOUS config root.
36
+ *
37
+ * The root moved `~/.oversky` → `~/.skrr` in the skrr rename, and an engine
38
+ * installed before that is still on disk under the old one. `daemon/src/
39
+ * binary-resolver.ts` was given this fallback and this module was not, so on
40
+ * the same machine the daemon found the engine and `skrr code` reported that no
41
+ * engine was installed — the same product, the same 106 MB binary, two answers.
42
+ *
43
+ * Returns null when an explicit `OVERSKY_CONFIG_DIR` is set, matching the
44
+ * daemon: that override names one root deliberately, and reaching past it to a
45
+ * hard-coded home would defeat the pinning {@link engineHome} relies on.
46
+ */
47
+ export declare function legacyManagedEnginePath(exeName: string, env?: NodeJS.ProcessEnv): string | null;
34
48
  export interface EngineResolution {
35
49
  path: string | null;
36
- source: 'env' | 'path' | 'managed' | 'fallback' | 'unresolved';
50
+ source: 'env' | 'path' | 'managed' | 'legacy-managed' | 'fallback' | 'unresolved';
37
51
  }
38
52
  /**
39
53
  * Resolve the engine binary, reporting WHERE it came from.
@@ -185,6 +199,7 @@ export interface EngineSpawnOptions {
185
199
  export declare function inheritedProviderCredentials(env: NodeJS.ProcessEnv): Record<string, string>;
186
200
  /** Whether an unmanaged run has anything to authenticate with. */
187
201
  export declare function hasProviderCredential(env?: NodeJS.ProcessEnv): boolean;
202
+ export declare function strippedProviderCredentialNames(env?: NodeJS.ProcessEnv): string[];
188
203
  /**
189
204
  * The environment the engine actually receives.
190
205
  *
@@ -21,11 +21,13 @@ exports.ENGINE_PATH_ENV = void 0;
21
21
  exports.engineHome = engineHome;
22
22
  exports.skyCodeInstructionHome = skyCodeInstructionHome;
23
23
  exports.managedEnginePath = managedEnginePath;
24
+ exports.legacyManagedEnginePath = legacyManagedEnginePath;
24
25
  exports.resolveEngine = resolveEngine;
25
26
  exports.buildEngineArgs = buildEngineArgs;
26
27
  exports.notInstalledMessage = notInstalledMessage;
27
28
  exports.inheritedProviderCredentials = inheritedProviderCredentials;
28
29
  exports.hasProviderCredential = hasProviderCredential;
30
+ exports.strippedProviderCredentialNames = strippedProviderCredentialNames;
29
31
  exports.engineSpawnEnv = engineSpawnEnv;
30
32
  exports.execEngine = execEngine;
31
33
  const node_child_process_1 = require("node:child_process");
@@ -33,6 +35,7 @@ const node_fs_1 = require("node:fs");
33
35
  const node_os_1 = require("node:os");
34
36
  const node_path_1 = __importDefault(require("node:path"));
35
37
  const auth_core_1 = require("@skrr-ai/auth-core");
38
+ const config_1 = require("./config");
36
39
  // Deliberately does NOT import the managed marker any more. This module used to
37
40
  // read it to decide whether a run was managed; that decision now arrives as a
38
41
  // declared `credentialMode`, and re-introducing the import here would be the first
@@ -49,14 +52,18 @@ exports.ENGINE_PATH_ENV = 'OVERSKY_SKY_CODE_PATH';
49
52
  * ordering below exists to prevent.
50
53
  */
51
54
  function engineHome(env = process.env) {
52
- const root = env.OVERSKY_CONFIG_DIR?.trim();
53
- return node_path_1.default.join(root || node_path_1.default.join((0, node_os_1.homedir)(), '.skrr'), 'sky-code');
55
+ // `configRoot` and not a second reading of the environment: deriving the root
56
+ // twice is what let this function and `getConfigPath()` disagree (OSK-300).
57
+ return node_path_1.default.join((0, config_1.configRoot)(env), 'sky-code');
54
58
  }
55
59
  /** The user-level instruction root owned by skrr Code. */
56
60
  function skyCodeInstructionHome(env = process.env) {
57
61
  const configured = env.SKY_CODE_HOME?.trim();
62
+ // Falls through to `engineHome()` rather than re-deriving `~/.skrr` — the two
63
+ // describe the same root, and re-deriving it is what made them disagree under
64
+ // `OVERSKY_CONFIG_DIR` (OSK-300).
58
65
  if (!configured)
59
- return node_path_1.default.join((0, node_os_1.homedir)(), '.skrr', 'sky-code');
66
+ return engineHome(env);
60
67
  if (configured === '~')
61
68
  return (0, node_os_1.homedir)();
62
69
  if (configured.startsWith('~/'))
@@ -70,6 +77,24 @@ function skyCodeInstructionHome(env = process.env) {
70
77
  function managedEnginePath(exeName, env = process.env) {
71
78
  return node_path_1.default.join(engineHome(env), 'bin', exeName);
72
79
  }
80
+ /**
81
+ * The same managed location under the PREVIOUS config root.
82
+ *
83
+ * The root moved `~/.oversky` → `~/.skrr` in the skrr rename, and an engine
84
+ * installed before that is still on disk under the old one. `daemon/src/
85
+ * binary-resolver.ts` was given this fallback and this module was not, so on
86
+ * the same machine the daemon found the engine and `skrr code` reported that no
87
+ * engine was installed — the same product, the same 106 MB binary, two answers.
88
+ *
89
+ * Returns null when an explicit `OVERSKY_CONFIG_DIR` is set, matching the
90
+ * daemon: that override names one root deliberately, and reaching past it to a
91
+ * hard-coded home would defeat the pinning {@link engineHome} relies on.
92
+ */
93
+ function legacyManagedEnginePath(exeName, env = process.env) {
94
+ if (env.OVERSKY_CONFIG_DIR?.trim())
95
+ return null;
96
+ return node_path_1.default.join((0, node_os_1.homedir)(), '.oversky', 'sky-code', 'bin', exeName);
97
+ }
73
98
  /**
74
99
  * Unmanaged well-known locations, checked after PATH.
75
100
  *
@@ -139,6 +164,15 @@ function resolveEngine(env = process.env) {
139
164
  const managed = managedEnginePath(exeName, env);
140
165
  if (isExecutable(managed))
141
166
  return { path: managed, source: 'managed' };
167
+ // The pre-rename managed location, SECOND. After the current one, so a fresh
168
+ // install always wins; before PATH, for the same WL-6.2 reason the current one
169
+ // beats PATH — a binary skrr installed outranks whatever happens to sit on the
170
+ // user's PATH, and which config root it was installed under does not change
171
+ // that. Reported as its own `source` so `skrr code doctor` can say where it
172
+ // came from rather than quietly resolving something surprising.
173
+ const legacy = legacyManagedEnginePath(exeName, env);
174
+ if (legacy && isExecutable(legacy))
175
+ return { path: legacy, source: 'legacy-managed' };
142
176
  const PATH = env.PATH ?? '';
143
177
  const sep = process.platform === 'win32' ? ';' : ':';
144
178
  const exeNames = process.platform === 'win32' ? ['sky-code.exe', 'sky-code.cmd'] : ['sky-code'];
@@ -198,15 +232,17 @@ function notInstalledMessage() {
198
232
  'The skrr Code engine (`sky-code`) is not installed on this machine.',
199
233
  '',
200
234
  'Install it through the daemon, which verifies the signed release:',
201
- ' • In the web app: the runtime menu beside the chat input → skrr Code → Install',
202
- ' • Make sure a daemon is running here first: `oversky status`',
235
+ ' • `skrr code install` — from here, no browser needed',
236
+ ' • Or in the web app: the runtime menu beside the chat input → skrr Code → Install',
237
+ ' • Either way a daemon must be running here: `skrr daemon status`',
203
238
  '',
204
239
  `Or point the CLI at an existing build: export ${exports.ENGINE_PATH_ENV}=/absolute/path/to/sky-code`,
205
240
  ' (an unsigned build runs, and since 2026-08-11 at the same trust tier as a',
206
241
  ' signed one — see `skrr code doctor` under trust-tier)',
207
242
  '',
208
- 'Run `skrr code doctor` for a full diagnosis, including which channel this',
209
- 'machine follows and whether that channel has a published release.',
243
+ 'Run `skrr code doctor` for a full diagnosis. Its `release-channel` line',
244
+ 'names the channel this machine follows and the exact manifest URL to check',
245
+ 'for a published release.',
210
246
  ].join('\n');
211
247
  }
212
248
  /**
@@ -220,6 +256,37 @@ function notInstalledMessage() {
220
256
  */
221
257
  const BYOK_CREDENTIAL_SUFFIXES = ['_API_KEY', '_AUTH_TOKEN'];
222
258
  const BYOK_CREDENTIAL_NAMES = new Set(['HUGGINGFACE_HUB_TOKEN']);
259
+ /**
260
+ * `AWS_*` names that are not credentials, and that Bedrock cannot run without.
261
+ *
262
+ * The `AWS_` prefix rule below exists for STS/IAM material — `AWS_ACCESS_KEY_ID`,
263
+ * `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_BEARER_TOKEN_BEDROCK` — and
264
+ * every one of those stays stripped. These three carry no secret: two are a
265
+ * region and one is the NAME of a profile whose credentials live in the AWS
266
+ * shared config, a file the engine can read anyway. Stripping them therefore
267
+ * protected nothing and cost an entire provider.
268
+ *
269
+ * Dogfooded as OSK-262, where `sky-code run "say hi"` answered on a Bedrock
270
+ * model and the identical run through `skrr code` died in the engine's generic
271
+ * error handler — because `AWS_PROFILE` did not survive the sanitizer.
272
+ * `env -u AWS_PROFILE` on the bare engine reproduced the failure exactly.
273
+ *
274
+ * An enumerated carve-out rather than a narrower prefix, so every future
275
+ * addition is a reviewable line that has to argue "this one is not a secret".
276
+ * The failure mode of the alternative is an exemption list that grows until the
277
+ * prefix rule means nothing.
278
+ *
279
+ * BYOK ONLY, and that is why it lives here rather than in `sanitizeSpawnEnv`.
280
+ * {@link engineSpawnEnv} re-admits nothing on a managed run, so a session
281
+ * spending a budgeted relay credential still cannot reach Bedrock directly and
282
+ * bill around its own budget. Putting the exemption in the shared sanitizer
283
+ * would hand it to the daemon's managed ACP path too, and lose that.
284
+ */
285
+ const BYOK_AWS_NON_SECRETS = new Set([
286
+ 'AWS_PROFILE',
287
+ 'AWS_REGION',
288
+ 'AWS_DEFAULT_REGION',
289
+ ]);
223
290
  /**
224
291
  * …and these are never inherited, whatever they look like.
225
292
  *
@@ -256,6 +323,11 @@ function inheritedProviderCredentials(env) {
256
323
  continue;
257
324
  if (ENGINE_NEVER_INHERITS.has(key))
258
325
  continue;
326
+ // Before the prefix rule, which would otherwise take these with the family.
327
+ if (BYOK_AWS_NON_SECRETS.has(key)) {
328
+ out[key] = value;
329
+ continue;
330
+ }
259
331
  if (ENGINE_NEVER_INHERITS_PREFIXES.some((prefix) => key.startsWith(prefix)))
260
332
  continue;
261
333
  if (BYOK_CREDENTIAL_NAMES.has(key) || BYOK_CREDENTIAL_SUFFIXES.some((s) => key.endsWith(s))) {
@@ -268,6 +340,37 @@ function inheritedProviderCredentials(env) {
268
340
  function hasProviderCredential(env = process.env) {
269
341
  return Object.keys(inheritedProviderCredentials(env)).length > 0;
270
342
  }
343
+ /**
344
+ * Provider-capable credentials this environment HAS and the engine will not get.
345
+ *
346
+ * `hasProviderCredential` answers "will the engine have a key", which is the
347
+ * right question for what to spawn and the wrong one for what to SAY. On a
348
+ * machine whose only credential is an AWS profile the two answers differ: the
349
+ * engine defaults to a Bedrock model and runs fine when launched directly, and
350
+ * `skrr code` — which strips `AWS_*` — reported "no provider credential is set
351
+ * here", sent the user to buy an OpenRouter key, and then died in the engine's
352
+ * generic error handler. The user had a working credential; this run removed it.
353
+ *
354
+ * "You have none" and "you have one and this run does not pass it on" are
355
+ * different problems with different fixes, so they must not share a sentence.
356
+ *
357
+ * Only the deny-listed names a PROVIDER could actually authenticate with are
358
+ * reported. `GH_TOKEN` and `NPM_TOKEN` are stripped too and are not model
359
+ * credentials, so naming them here would turn a precise sentence into noise.
360
+ */
361
+ const STRIPPED_PROVIDER_CREDENTIALS = [
362
+ // Bedrock's SECRET material only. `AWS_PROFILE` and the region variables are
363
+ // exempt ({@link BYOK_AWS_NON_SECRETS}) and now reach the engine, so naming
364
+ // them here would make this sentence contradict the spawn — which is the exact
365
+ // defect this reporter was added to end.
366
+ 'AWS_ACCESS_KEY_ID',
367
+ 'AWS_BEARER_TOKEN_BEDROCK',
368
+ // Anthropic OAuth, deny-listed by name in ENGINE_NEVER_INHERITS.
369
+ 'CLAUDE_CODE_OAUTH_TOKEN',
370
+ ];
371
+ function strippedProviderCredentialNames(env = process.env) {
372
+ return STRIPPED_PROVIDER_CREDENTIALS.filter((name) => (env[name] ?? '').trim() !== '');
373
+ }
271
374
  /**
272
375
  * The environment the engine actually receives.
273
376
  *
@@ -27,6 +27,7 @@ exports.sleep = sleep;
27
27
  exports.compactSnapshotSignature = compactSnapshotSignature;
28
28
  const data_provider_1 = require("@skrr-ai/data-provider");
29
29
  const tasks_1 = require("./tasks");
30
+ const html_text_1 = require("./html-text");
30
31
  /**
31
32
  * Statuses at which an execution is OVER — nothing further will move the task
32
33
  * without new input.
@@ -304,17 +305,9 @@ function compactSnapshotSignature(snapshot) {
304
305
  .sort()
305
306
  .join('|');
306
307
  }
307
- function stripHtml(value) {
308
- return value
309
- .replace(/<br\s*\/?>/gi, '\n')
310
- .replace(/<\/p>/gi, '\n')
311
- .replace(/<[^>]+>/g, ' ')
312
- .replace(/&nbsp;/g, ' ')
313
- .replace(/&#39;/g, "'")
314
- .replace(/&quot;/g, '"')
315
- .replace(/&amp;/g, '&')
316
- .replace(/[ \t]+/g, ' ');
317
- }
308
+ // Was a private copy here; it is the same job `tasks show` needs, and two
309
+ // slightly different HTML strippers is how the two surfaces drift.
310
+ const stripHtml = html_text_1.htmlToDisplayText;
318
311
  function stringValue(value) {
319
312
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
320
313
  }
@@ -1,3 +1,4 @@
1
+ export declare const TASK_PRIORITIES: readonly ["low", "medium", "high", "critical"];
1
2
  /**
2
3
  * The kinds `tasks events append --kind` will accept.
3
4
  *
package/dist/lib/tasks.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TASK_WORK_EVENT_KINDS = void 0;
3
+ exports.TASK_WORK_EVENT_KINDS = exports.TASK_PRIORITIES = void 0;
4
4
  exports.releasePinRepairGuard = releasePinRepairGuard;
5
5
  exports.taskUpdateMutationGuard = taskUpdateMutationGuard;
6
6
  exports.executionIsolationFromWorktreeFlag = executionIsolationFromWorktreeFlag;
@@ -30,7 +30,7 @@ exports.normalizeBulkUpdateInput = normalizeBulkUpdateInput;
30
30
  const data_provider_1 = require("@skrr-ai/data-provider");
31
31
  const prompt_1 = require("./prompt");
32
32
  const projects_1 = require("./projects");
33
- const TASK_PRIORITIES = ['low', 'medium', 'high', 'critical'];
33
+ exports.TASK_PRIORITIES = ['low', 'medium', 'high', 'critical'];
34
34
  const DESCRIPTION_FORMATS = ['html', 'markdown', 'plain'];
35
35
  /**
36
36
  * The kinds `tasks events append --kind` will accept.
@@ -201,8 +201,8 @@ function validateTaskCreatePayload(payload) {
201
201
  errors.push(`descriptionFormat must be one of: ${DESCRIPTION_FORMATS.join(', ')}`);
202
202
  }
203
203
  if (payload.priority !== undefined &&
204
- !TASK_PRIORITIES.includes(payload.priority)) {
205
- errors.push(`priority must be one of: ${TASK_PRIORITIES.join(', ')}`);
204
+ !exports.TASK_PRIORITIES.includes(payload.priority)) {
205
+ errors.push(`priority must be one of: ${exports.TASK_PRIORITIES.join(', ')}`);
206
206
  }
207
207
  if (payload.externalKey !== undefined && !isBoundedString(payload.externalKey, 1, 300)) {
208
208
  errors.push('externalKey must be a non-empty string at most 300 characters');
@@ -566,9 +566,12 @@ function taskRef(task) {
566
566
  return '';
567
567
  }
568
568
  function formatTaskLabel(task) {
569
- const id = taskId(task) || '?';
569
+ // Ref first, id as the fallback — matching every other entity's confirmation
570
+ // (see `lib/created-line.ts`). Printing both put a uuid in front of the ref a
571
+ // person would actually type, and the `View it at` line already carries the id.
570
572
  const ref = taskRef(task);
571
- return `${id}${ref ? ` (${ref})` : ''} — ${String(task.title ?? '(no title)')}`;
573
+ const label = ref || taskId(task) || '?';
574
+ return `${label} — ${String(task.title ?? '(no title)')}`;
572
575
  }
573
576
  function hasTaskAssignee(task) {
574
577
  return (stringArray(task?.assigneeAgentIds).length > 0 || stringArray(task?.assigneeUserIds).length > 0);
@@ -138,7 +138,7 @@ function buildNudgeLine(currentVersion, latest, npmPackage) {
138
138
  if (!latest || !isOlderVersion(currentVersion, latest))
139
139
  return null;
140
140
  const pkg = npmPackage || '@skrr-ai/cli';
141
- return (`[sky] Update available: ${currentVersion} → ${latest}. ` +
141
+ return (`[skrr] Update available: ${currentVersion} → ${latest}. ` +
142
142
  `Run \`npm update -g ${pkg}\` (or update the skrr app). ` +
143
143
  `Silence with OVERSKY_NO_UPDATE_NUDGE=1.\n`);
144
144
  }
@@ -95,7 +95,7 @@ function buildUsageReference(manifest, domainInput, options = {}) {
95
95
  }
96
96
  function renderUsageOverview(overview) {
97
97
  const lines = [
98
- `Sky command domains (${overview.domains.length}; manifest-derived).`,
98
+ `skrr command domains (${overview.domains.length}; manifest-derived).`,
99
99
  'Read one domain at a time: skrr usage <domain>.',
100
100
  ...overview.domains.map(({ domain }) => domain),
101
101
  ];
@@ -40,6 +40,7 @@ exports.withNorthstarUrl = withNorthstarUrl;
40
40
  exports.withAgentUrl = withAgentUrl;
41
41
  exports.withDataUrls = withDataUrls;
42
42
  exports.workflowUrlFrom = workflowUrlFrom;
43
+ const publicEndpoints_generated_1 = require("./publicEndpoints.generated");
43
44
  /**
44
45
  * Site-relative canonical path for an entity, or `null` when the required id is
45
46
  * missing. When a task/goal knows its hosting space we emit the canonical
@@ -141,8 +142,18 @@ function webUrl(baseURL, ref) {
141
142
  * custom) passes through unchanged — only the known skrr api hosts are mapped.
142
143
  */
143
144
  const WEB_ORIGIN_FROM_API = {
145
+ // DERIVED from the one domain contract, not hand-listed. The hand-listed
146
+ // version knew only the pre-rename hosts, so `api.skrr.ai` — the CURRENT prod
147
+ // API origin — mapped to nothing and fell through unchanged, and every link
148
+ // the CLI printed from that baseURL would point at the API host instead of
149
+ // the SPA. Deriving it means the next environment cannot be silently omitted.
150
+ ...Object.fromEntries(Object.values(publicEndpoints_generated_1.OVERSKY_ENVIRONMENT_ENDPOINTS).map((e) => [
151
+ e.realtimeUrl.toLowerCase(),
152
+ e.appUrl,
153
+ ])),
154
+ // Prod's retained previous origin. `oversky.ai` still resolves and is
155
+ // deliberately kept (LEGACY_PROD_BASE_URL), so its api. host must map too.
144
156
  'https://api.oversky.ai': 'https://oversky.ai',
145
- 'https://api.oversky.dev': 'https://oversky.dev',
146
157
  };
147
158
  function toWebOrigin(baseURL) {
148
159
  const trimmed = trimTrailingSlash(baseURL);
@@ -215,7 +215,7 @@ export declare class AuthHelperUnavailableError extends Error {
215
215
  /**
216
216
  * L6.1 — typed error thrown when the workspace-trust gate blocks a
217
217
  * project- or local-scope helper. Surfaces the actionable next step
218
- * (`oversky trust accept`) to the user; the daemon catches and presents
218
+ * (`skrrd trust accept`) to the user; the daemon catches and presents
219
219
  * this without falling through to OAuth.
220
220
  */
221
221
  export declare class AuthHelperUntrustedError extends Error {