@skrr-ai/cli 0.1.47 → 0.1.49

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 (286) hide show
  1. package/README.md +1 -1
  2. package/dist/base-command.d.ts +18 -0
  3. package/dist/base-command.js +61 -1
  4. package/dist/commands/agent-worker.d.ts +12 -0
  5. package/dist/commands/agent-worker.js +140 -0
  6. package/dist/commands/agents/chat.d.ts +21 -0
  7. package/dist/commands/agents/chat.js +26 -9
  8. package/dist/commands/balance/usage/breakdown.d.ts +14 -0
  9. package/dist/commands/balance/usage/breakdown.js +68 -0
  10. package/dist/commands/balance/usage.js +24 -0
  11. package/dist/commands/commerce/entitlements/explain.d.ts +22 -0
  12. package/dist/commands/commerce/entitlements/explain.js +40 -0
  13. package/dist/commands/commerce/incidents/audit.d.ts +20 -0
  14. package/dist/commands/commerce/incidents/audit.js +37 -0
  15. package/dist/commands/commerce/incidents/list.d.ts +22 -0
  16. package/dist/commands/commerce/incidents/list.js +49 -0
  17. package/dist/commands/commerce/incidents/resolve.d.ts +23 -0
  18. package/dist/commands/commerce/incidents/resolve.js +45 -0
  19. package/dist/commands/commerce/incidents/retry.d.ts +22 -0
  20. package/dist/commands/commerce/incidents/retry.js +45 -0
  21. package/dist/commands/commerce/incidents/show.d.ts +13 -0
  22. package/dist/commands/commerce/incidents/show.js +30 -0
  23. package/dist/commands/commerce/offers/approve.d.ts +17 -0
  24. package/dist/commands/commerce/offers/approve.js +33 -0
  25. package/dist/commands/commerce/offers/create.d.ts +18 -0
  26. package/dist/commands/commerce/offers/create.js +34 -0
  27. package/dist/commands/commerce/offers/publish.d.ts +13 -0
  28. package/dist/commands/commerce/offers/publish.js +28 -0
  29. package/dist/commands/commerce/offers/retire.d.ts +17 -0
  30. package/dist/commands/commerce/offers/retire.js +32 -0
  31. package/dist/commands/commerce/offers/validate.d.ts +18 -0
  32. package/dist/commands/commerce/offers/validate.js +33 -0
  33. package/dist/commands/commerce/products/create.d.ts +10 -0
  34. package/dist/commands/commerce/products/create.js +25 -0
  35. package/dist/commands/commerce/promotions/redeem.d.ts +13 -0
  36. package/dist/commands/commerce/promotions/redeem.js +32 -0
  37. package/dist/commands/commerce/terms/accept.d.ts +18 -0
  38. package/dist/commands/commerce/terms/accept.js +39 -0
  39. package/dist/commands/commerce/terms/show.d.ts +10 -0
  40. package/dist/commands/commerce/terms/show.js +34 -0
  41. package/dist/commands/commerce/trials/conversion-preview.d.ts +18 -0
  42. package/dist/commands/commerce/trials/conversion-preview.js +39 -0
  43. package/dist/commands/commerce/trials/start.d.ts +23 -0
  44. package/dist/commands/commerce/trials/start.js +58 -0
  45. package/dist/commands/commitments/accounting.d.ts +39 -0
  46. package/dist/commands/commitments/accounting.js +116 -0
  47. package/dist/commands/commitments/action-history.d.ts +1 -0
  48. package/dist/commands/commitments/action-history.js +8 -1
  49. package/dist/commands/commitments/case.d.ts +1 -0
  50. package/dist/commands/commitments/case.js +19 -3
  51. package/dist/commands/commitments/cases.d.ts +1 -0
  52. package/dist/commands/commitments/cases.js +11 -1
  53. package/dist/commands/commitments/checks.d.ts +1 -0
  54. package/dist/commands/commitments/checks.js +5 -1
  55. package/dist/commands/commitments/cost.d.ts +62 -0
  56. package/dist/commands/commitments/cost.js +130 -0
  57. package/dist/commands/commitments/create.js +1 -1
  58. package/dist/commands/commitments/delete.d.ts +1 -0
  59. package/dist/commands/commitments/delete.js +56 -6
  60. package/dist/commands/commitments/feedback.js +9 -1
  61. package/dist/commands/commitments/handover.js +16 -0
  62. package/dist/commands/commitments/hypotheses.d.ts +1 -0
  63. package/dist/commands/commitments/hypotheses.js +17 -2
  64. package/dist/commands/commitments/links/list.js +4 -1
  65. package/dist/commands/commitments/liveness.d.ts +18 -0
  66. package/dist/commands/commitments/liveness.js +80 -0
  67. package/dist/commands/commitments/metrics.d.ts +1 -0
  68. package/dist/commands/commitments/metrics.js +8 -1
  69. package/dist/commands/commitments/next-tick.d.ts +39 -0
  70. package/dist/commands/commitments/next-tick.js +122 -0
  71. package/dist/commands/commitments/observations.d.ts +1 -0
  72. package/dist/commands/commitments/observations.js +19 -2
  73. package/dist/commands/commitments/pause.js +12 -0
  74. package/dist/commands/commitments/receipt.d.ts +2 -0
  75. package/dist/commands/commitments/receipt.js +16 -2
  76. package/dist/commands/commitments/remediation-proposal.js +6 -2
  77. package/dist/commands/commitments/remediation-proposals.js +5 -1
  78. package/dist/commands/commitments/restore.d.ts +25 -0
  79. package/dist/commands/commitments/restore.js +46 -0
  80. package/dist/commands/commitments/show.js +32 -0
  81. package/dist/commands/commitments/trigger-status.js +33 -0
  82. package/dist/commands/commitments/update.d.ts +1 -0
  83. package/dist/commands/commitments/update.js +31 -5
  84. package/dist/commands/commitments/wake-capabilities.d.ts +0 -1
  85. package/dist/commands/commitments/wake-capabilities.js +8 -4
  86. package/dist/commands/enterprise/budgets/create.d.ts +11 -0
  87. package/dist/commands/enterprise/budgets/create.js +27 -0
  88. package/dist/commands/enterprise/budgets/evaluate.d.ts +17 -0
  89. package/dist/commands/enterprise/budgets/evaluate.js +32 -0
  90. package/dist/commands/enterprise/budgets/publish.d.ts +14 -0
  91. package/dist/commands/enterprise/budgets/publish.js +30 -0
  92. package/dist/commands/enterprise/contracts/activate.d.ts +14 -0
  93. package/dist/commands/enterprise/contracts/activate.js +30 -0
  94. package/dist/commands/enterprise/contracts/create.d.ts +14 -0
  95. package/dist/commands/enterprise/contracts/create.js +32 -0
  96. package/dist/commands/enterprise/contracts/issue.d.ts +18 -0
  97. package/dist/commands/enterprise/contracts/issue.js +34 -0
  98. package/dist/commands/enterprise/domains/begin.d.ts +20 -0
  99. package/dist/commands/enterprise/domains/begin.js +39 -0
  100. package/dist/commands/enterprise/domains/verify.d.ts +14 -0
  101. package/dist/commands/enterprise/domains/verify.js +32 -0
  102. package/dist/commands/enterprise/external-config/activate.d.ts +22 -0
  103. package/dist/commands/enterprise/external-config/activate.js +49 -0
  104. package/dist/commands/enterprise/external-config/set.d.ts +25 -0
  105. package/dist/commands/enterprise/external-config/set.js +123 -0
  106. package/dist/commands/enterprise/external-config/show.d.ts +12 -0
  107. package/dist/commands/enterprise/external-config/show.js +39 -0
  108. package/dist/commands/enterprise/external-config/suspend.d.ts +13 -0
  109. package/dist/commands/enterprise/external-config/suspend.js +41 -0
  110. package/dist/commands/enterprise/finance/close-snapshot.d.ts +11 -0
  111. package/dist/commands/enterprise/finance/close-snapshot.js +28 -0
  112. package/dist/commands/enterprise/finance/record-document.d.ts +18 -0
  113. package/dist/commands/enterprise/finance/record-document.js +35 -0
  114. package/dist/commands/enterprise/profile.d.ts +20 -0
  115. package/dist/commands/enterprise/profile.js +38 -0
  116. package/dist/commands/login.d.ts +13 -0
  117. package/dist/commands/login.js +77 -0
  118. package/dist/commands/machines/dedicated/index.js +3 -0
  119. package/dist/commands/machines/dedicated/service/apply.d.ts +23 -0
  120. package/dist/commands/machines/dedicated/service/apply.js +99 -0
  121. package/dist/commands/machines/dedicated/service/approve.d.ts +23 -0
  122. package/dist/commands/machines/dedicated/service/approve.js +52 -0
  123. package/dist/commands/machines/dedicated/service/create.d.ts +55 -0
  124. package/dist/commands/machines/dedicated/service/create.js +222 -0
  125. package/dist/commands/machines/dedicated/service/edit.d.ts +30 -0
  126. package/dist/commands/machines/dedicated/service/edit.js +146 -0
  127. package/dist/commands/machines/dedicated/service/exec.d.ts +26 -0
  128. package/dist/commands/machines/dedicated/service/exec.js +92 -0
  129. package/dist/commands/machines/dedicated/service/export.d.ts +29 -0
  130. package/dist/commands/machines/dedicated/service/export.js +106 -0
  131. package/dist/commands/machines/dedicated/service/index.d.ts +14 -0
  132. package/dist/commands/machines/dedicated/service/index.js +49 -0
  133. package/dist/commands/machines/dedicated/service/logs.d.ts +33 -0
  134. package/dist/commands/machines/dedicated/service/logs.js +148 -0
  135. package/dist/commands/machines/dedicated/service/ls.d.ts +20 -0
  136. package/dist/commands/machines/dedicated/service/ls.js +80 -0
  137. package/dist/commands/machines/dedicated/service/restart.d.ts +14 -0
  138. package/dist/commands/machines/dedicated/service/restart.js +29 -0
  139. package/dist/commands/machines/dedicated/service/rm.d.ts +20 -0
  140. package/dist/commands/machines/dedicated/service/rm.js +33 -0
  141. package/dist/commands/machines/dedicated/service/secret/index.d.ts +14 -0
  142. package/dist/commands/machines/dedicated/service/secret/index.js +25 -0
  143. package/dist/commands/machines/dedicated/service/secret/rm.d.ts +22 -0
  144. package/dist/commands/machines/dedicated/service/secret/rm.js +54 -0
  145. package/dist/commands/machines/dedicated/service/secret/set.d.ts +22 -0
  146. package/dist/commands/machines/dedicated/service/secret/set.js +93 -0
  147. package/dist/commands/machines/dedicated/service/start.d.ts +14 -0
  148. package/dist/commands/machines/dedicated/service/start.js +29 -0
  149. package/dist/commands/machines/dedicated/service/status.d.ts +21 -0
  150. package/dist/commands/machines/dedicated/service/status.js +85 -0
  151. package/dist/commands/machines/dedicated/service/stop.d.ts +20 -0
  152. package/dist/commands/machines/dedicated/service/stop.js +35 -0
  153. package/dist/commands/machines/dedicated/service/top.d.ts +22 -0
  154. package/dist/commands/machines/dedicated/service/top.js +120 -0
  155. package/dist/commands/machines/dedicated/sign-in-status.d.ts +22 -0
  156. package/dist/commands/machines/dedicated/sign-in-status.js +79 -0
  157. package/dist/commands/machines/dedicated/ssh-config.d.ts +28 -0
  158. package/dist/commands/machines/dedicated/ssh-config.js +66 -0
  159. package/dist/commands/machines/dedicated/ssh-proxy.d.ts +22 -0
  160. package/dist/commands/machines/dedicated/ssh-proxy.js +62 -0
  161. package/dist/commands/machines/dedicated/ssh.d.ts +29 -0
  162. package/dist/commands/machines/dedicated/ssh.js +121 -0
  163. package/dist/commands/native/allow-all.d.ts +14 -0
  164. package/dist/commands/native/allow-all.js +25 -0
  165. package/dist/commands/native/allow.d.ts +24 -0
  166. package/dist/commands/native/allow.js +45 -0
  167. package/dist/commands/native/deny.d.ts +24 -0
  168. package/dist/commands/native/deny.js +43 -0
  169. package/dist/commands/native/disable.d.ts +17 -0
  170. package/dist/commands/native/disable.js +28 -0
  171. package/dist/commands/native/enable.d.ts +12 -0
  172. package/dist/commands/native/enable.js +29 -0
  173. package/dist/commands/native/list-apps.d.ts +19 -0
  174. package/dist/commands/native/list-apps.js +30 -0
  175. package/dist/commands/native/restrict-to.d.ts +22 -0
  176. package/dist/commands/native/restrict-to.js +41 -0
  177. package/dist/commands/native/status.d.ts +19 -0
  178. package/dist/commands/native/status.js +33 -0
  179. package/dist/commands/native.d.ts +39 -0
  180. package/dist/commands/native.js +76 -0
  181. package/dist/commands/service/index.d.ts +14 -0
  182. package/dist/commands/service/index.js +31 -0
  183. package/dist/commands/service/logs.d.ts +18 -0
  184. package/dist/commands/service/logs.js +53 -0
  185. package/dist/commands/service/ls.d.ts +13 -0
  186. package/dist/commands/service/ls.js +48 -0
  187. package/dist/commands/service/propose.d.ts +34 -0
  188. package/dist/commands/service/propose.js +113 -0
  189. package/dist/commands/service/status.d.ts +17 -0
  190. package/dist/commands/service/status.js +56 -0
  191. package/dist/commands/spaces/auto-executor/runs.d.ts +13 -0
  192. package/dist/commands/spaces/auto-executor/runs.js +56 -0
  193. package/dist/commands/store/governance/artifacts.d.ts +25 -0
  194. package/dist/commands/store/governance/artifacts.js +55 -0
  195. package/dist/commands/store/governance/assign.d.ts +16 -0
  196. package/dist/commands/store/governance/assign.js +54 -0
  197. package/dist/commands/store/governance/create-license.d.ts +18 -0
  198. package/dist/commands/store/governance/create-license.js +35 -0
  199. package/dist/commands/store/governance/install-plan.d.ts +25 -0
  200. package/dist/commands/store/governance/install-plan.js +56 -0
  201. package/dist/commands/store/governance/license-policy.d.ts +30 -0
  202. package/dist/commands/store/governance/license-policy.js +69 -0
  203. package/dist/commands/store/governance/policy.d.ts +25 -0
  204. package/dist/commands/store/governance/policy.js +65 -0
  205. package/dist/commands/store/governance/publish-release.d.ts +17 -0
  206. package/dist/commands/store/governance/publish-release.js +34 -0
  207. package/dist/commands/tasks/deliverable/add.d.ts +15 -0
  208. package/dist/commands/tasks/deliverable/add.js +174 -0
  209. package/dist/commands/tasks/deliverable/archive.d.ts +35 -0
  210. package/dist/commands/tasks/deliverable/archive.js +205 -0
  211. package/dist/commands/tasks/labels/detach.js +3 -0
  212. package/dist/commands/tasks/labels/suggest.d.ts +24 -0
  213. package/dist/commands/tasks/labels/suggest.js +69 -0
  214. package/dist/commands/tasks/list.d.ts +16 -2
  215. package/dist/commands/tasks/list.js +100 -24
  216. package/dist/commands/tasks/show.d.ts +23 -0
  217. package/dist/commands/tasks/show.js +51 -1
  218. package/dist/commands/wiki/rm.d.ts +22 -1
  219. package/dist/commands/wiki/rm.js +52 -3
  220. package/dist/lib/agentic-stream.js +10 -2
  221. package/dist/lib/balance.d.ts +6 -1
  222. package/dist/lib/balance.js +15 -0
  223. package/dist/lib/commerce-command.d.ts +48 -0
  224. package/dist/lib/commerce-command.js +70 -0
  225. package/dist/lib/commerce.d.ts +93 -0
  226. package/dist/lib/commerce.js +129 -0
  227. package/dist/lib/commitment-product.js +1 -1
  228. package/dist/lib/commitments.d.ts +202 -29
  229. package/dist/lib/commitments.js +300 -33
  230. package/dist/lib/daemon-installer.d.ts +6 -5
  231. package/dist/lib/daemon-installer.js +4 -17
  232. package/dist/lib/dedicated-lease-command.js +10 -0
  233. package/dist/lib/dedicated-machines.d.ts +37 -0
  234. package/dist/lib/dedicated-machines.js +47 -0
  235. package/dist/lib/dedicated-service-command.d.ts +60 -0
  236. package/dist/lib/dedicated-service-command.js +182 -0
  237. package/dist/lib/dedicated-service.d.ts +342 -0
  238. package/dist/lib/dedicated-service.js +741 -0
  239. package/dist/lib/dedicated-ssh.d.ts +136 -0
  240. package/dist/lib/dedicated-ssh.js +387 -0
  241. package/dist/lib/delegated-cli.js +51 -13
  242. package/dist/lib/enterprise-commerce.d.ts +67 -0
  243. package/dist/lib/enterprise-commerce.js +112 -0
  244. package/dist/lib/enterprise-external-configuration.d.ts +60 -0
  245. package/dist/lib/enterprise-external-configuration.js +58 -0
  246. package/dist/lib/first-party-harness.js +17 -3
  247. package/dist/lib/governed-store.d.ts +110 -0
  248. package/dist/lib/governed-store.js +79 -0
  249. package/dist/lib/guest-service-command.d.ts +16 -0
  250. package/dist/lib/guest-service-command.js +32 -0
  251. package/dist/lib/guest-service.d.ts +67 -0
  252. package/dist/lib/guest-service.js +112 -0
  253. package/dist/lib/prompt.d.ts +1 -0
  254. package/dist/lib/prompt.js +1 -0
  255. package/dist/lib/task-asset-upload.d.ts +20 -0
  256. package/dist/lib/task-asset-upload.js +30 -8
  257. package/dist/lib/task-extras.d.ts +23 -0
  258. package/dist/lib/task-extras.js +6 -0
  259. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.d.ts +9 -3
  260. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.js +10 -3
  261. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.d.ts +1 -1
  262. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.js +1 -1
  263. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -2
  264. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +8 -5
  265. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.d.ts +16 -0
  266. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +21 -4
  267. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseManifest.d.ts +38 -0
  268. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseManifest.js +66 -1
  269. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.d.ts +1 -1
  270. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.js +24 -2
  271. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.d.ts +9 -3
  272. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.js +10 -3
  273. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.d.ts +1 -1
  274. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.js +1 -1
  275. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -2
  276. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +2 -2
  277. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.d.ts +16 -0
  278. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +20 -4
  279. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseManifest.d.ts +38 -0
  280. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseManifest.js +64 -0
  281. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.d.ts +1 -1
  282. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.js +24 -2
  283. package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
  284. package/dist/node_modules/@skrr-ai/data-provider/index.js +5060 -4827
  285. package/oclif.manifest.json +35194 -29157
  286. package/package.json +43 -1
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAX_SIGS = void 0;
3
+ exports.TRUSTED_FEED_ORIGINS = exports.MAX_SIGS = void 0;
4
4
  exports.buildArtifactMessage = buildArtifactMessage;
5
5
  exports.buildManifestMessage = buildManifestMessage;
6
6
  exports.verifyArtifact = verifyArtifact;
7
7
  exports.verifyManifest = verifyManifest;
8
8
  exports.getDeltaFor = getDeltaFor;
9
+ exports.isTrustedArtifactOrigin = isTrustedArtifactOrigin;
9
10
  /**
10
11
  * release-manifest.ts — signed daemon release manifest: types, canonical
11
12
  * signature messages, and offline ed25519 verification.
@@ -233,3 +234,67 @@ function getDeltaFor(artifact, fromVersion) {
233
234
  }
234
235
  return d;
235
236
  }
237
+ // ---------------------------------------------------------------------------
238
+ // Trusted artifact origins
239
+ // ---------------------------------------------------------------------------
240
+ /**
241
+ * Origins an artifact may be served from, beyond the feed base this run used.
242
+ *
243
+ * WHY A SET AND NOT THE ONE ORIGIN
244
+ * --------------------------------
245
+ * The pin used to require the artifact origin to EQUAL the feed base's
246
+ * origin. That is correct with one host and unsatisfiable with two, which the
247
+ * skrr rename creates:
248
+ *
249
+ * - a shipped daemon/CLI has `updates.oversky.ai` compiled in, so a manifest
250
+ * advertising skrr.ai artifacts is refused and it can never self-update
251
+ * again — including to the build that would have fixed it;
252
+ * - a new build shipping `updates.skrr.ai` refuses the SAME manifest for the
253
+ * mirror-image reason.
254
+ *
255
+ * One manifest of absolute URLs therefore cannot serve both, and the update
256
+ * path is the one thing that must not break: a client that cannot update
257
+ * cannot be repaired remotely.
258
+ *
259
+ * Widening to a small, closed set of origins we publish keeps the property the
260
+ * pin exists for: with keys pinned the ed25519 signature already binds the
261
+ * URL, and this is defence-in-depth for when verification is disabled —
262
+ * stopping a manifest-integrity failure from redirecting a download to an
263
+ * ARBITRARY origin serving a hash-matching payload. An attacker gains nothing
264
+ * from a second origin that is also ours.
265
+ *
266
+ * Both entries are removed down to one when no shipped client uses the old
267
+ * host, per the add -> verify -> remove ordering.
268
+ */
269
+ exports.TRUSTED_FEED_ORIGINS = [
270
+ 'https://updates.oversky.ai',
271
+ 'https://updates.skrr.ai',
272
+ ];
273
+ /**
274
+ * True when `candidate` may serve an artifact for a feed rooted at `feedBase`.
275
+ *
276
+ * The feed base's own origin always passes, so an override
277
+ * (OVERSKY_DAEMON_UPDATE_FEED_BASE, a canary, a test server) keeps working
278
+ * without being listed here.
279
+ */
280
+ function isTrustedArtifactOrigin(candidate, feedBase) {
281
+ let feedOrigin;
282
+ try {
283
+ feedOrigin = new URL(feedBase).origin;
284
+ }
285
+ catch {
286
+ return false;
287
+ }
288
+ // Callers hand over either a bare origin (the daemon's self-updater) or a
289
+ // full artifact URL (the CLI installer) — both spell the same check.
290
+ let candidateOrigin = candidate;
291
+ try {
292
+ candidateOrigin = new URL(candidate).origin;
293
+ }
294
+ catch {
295
+ /* not a URL — compare raw; it will not match anything */
296
+ }
297
+ if (candidateOrigin === feedOrigin)
298
+ return true;
299
+ return exports.TRUSTED_FEED_ORIGINS.includes(candidateOrigin);
300
+ }
@@ -75,7 +75,7 @@ export declare const SENSITIVE_ENV_SUFFIXES: readonly string[];
75
75
  * `SECRETARY` untouched.
76
76
  */
77
77
  export declare const SENSITIVE_ENV_NAME_TOKENS: readonly string[];
78
- /** Specific OVERSKY_ vars to keep (the prefix sweep is broad on purpose). */
78
+ /** Specific names to keep — the prefix sweeps are broad on purpose. */
79
79
  export declare const SENSITIVE_ENV_PREFIX_EXCEPTIONS: ReadonlySet<string>;
80
80
  /**
81
81
  * Build a sanitized snapshot of the parent's own env for a spawned
@@ -61,6 +61,9 @@ exports.sanitizeSpawnEnv = sanitizeSpawnEnv;
61
61
  exports.SENSITIVE_ENV_VARS = new Set([
62
62
  'CLAUDE_CODE_OAUTH_TOKEN',
63
63
  'OVERSKY_TOKEN',
64
+ // The renamed credential alias (cli/src/lib/config.ts honors both spellings).
65
+ // Same double coverage as OVERSKY_TOKEN — name AND the SKRR_ prefix below.
66
+ 'SKRR_TOKEN',
64
67
  'AWS_ACCESS_KEY_ID',
65
68
  'AWS_SECRET_ACCESS_KEY',
66
69
  'AWS_SESSION_TOKEN',
@@ -91,7 +94,16 @@ exports.SENSITIVE_ENV_VARS = new Set([
91
94
  'LD_PRELOAD',
92
95
  ]);
93
96
  /** Variable name prefixes that should be stripped (catches families like AWS_*). */
94
- exports.SENSITIVE_ENV_PREFIXES = ['AWS_', 'OVERSKY_'];
97
+ exports.SENSITIVE_ENV_PREFIXES = [
98
+ 'AWS_',
99
+ 'OVERSKY_',
100
+ // The renamed product namespace: SKRR_TOKEN, SKRR_REFRESH_TOKEN, the
101
+ // session-authority aliases (SKRR_SESSION_*, SKRR_BASE_URL), and the
102
+ // daemon's control-plane identity (SKRR_MACHINE_UUID, SKRR_LEASE_GENERATION)
103
+ // all carry authority a model-driven child must not inherit. Non-secret
104
+ // lane essentials live in SENSITIVE_ENV_PREFIX_EXCEPTIONS below.
105
+ 'SKRR_',
106
+ ];
95
107
  /**
96
108
  * Credential-shaped suffixes are also forbidden. A fixed provider list is
97
109
  * never complete: a newly configured provider would otherwise leak its key
@@ -120,7 +132,7 @@ exports.SENSITIVE_ENV_SUFFIXES = [
120
132
  * `SECRETARY` untouched.
121
133
  */
122
134
  exports.SENSITIVE_ENV_NAME_TOKENS = ['SECRET'];
123
- /** Specific OVERSKY_ vars to keep (the prefix sweep is broad on purpose). */
135
+ /** Specific names to keep — the prefix sweeps are broad on purpose. */
124
136
  exports.SENSITIVE_ENV_PREFIX_EXCEPTIONS = new Set([
125
137
  // Headless flag is read by spawned tools to know they're inside the daemon —
126
138
  // not a secret. Add more here if a tool legitimately needs an OVERSKY_ var.
@@ -130,6 +142,16 @@ exports.SENSITIVE_ENV_PREFIX_EXCEPTIONS = new Set([
130
142
  // know they're inside a supervised daemon on Linux/Windows in addition
131
143
  // to macOS launchd. Not a secret.
132
144
  'OVERSKY_SUPERVISOR',
145
+ // A deployment URL, not a credential. The rename to SKRR_SERVER_URL was
146
+ // chosen precisely because it survives the sanitizer
147
+ // (daemon/src/dedicated-tenant-env.ts), so a spawned lane's `skrr` reaches
148
+ // the deployment this machine is registered with.
149
+ 'SKRR_SERVER_URL',
150
+ // The Dedicated Runtime workload marker the exec wrapper stamps into every
151
+ // tenant lane; grandchildren spawned from a lane (e.g. `skrr code` → the
152
+ // engine) must keep it to detect they already run as the workload uid. Not
153
+ // a secret — it authorizes nothing without the matching real uid.
154
+ 'SKRR_WORKLOAD_UID',
133
155
  ]);
134
156
  /**
135
157
  * Build a sanitized snapshot of the parent's own env for a spawned
@@ -29,29 +29,35 @@
29
29
  * never rename in place.
30
30
  */
31
31
  /**
32
- * The canonical daemon scope vocabulary. Six strings, frozen.
32
+ * The canonical daemon scope vocabulary. Seven strings, append-only.
33
33
  *
34
34
  * - `daemon:tools:bash` — bash tool execution
35
35
  * - `daemon:tools:fs:read` — Read tool (file read)
36
36
  * - `daemon:tools:fs:write` — Write + Edit tools (file mutation)
37
37
  * - `daemon:browser:cdp` — browser automation via CDP (reserved)
38
+ * - `daemon:native-ui:control` — native app GUI control via the helper
38
39
  * - `daemon:session:replay` — `daemon:session:replay` socket event
39
40
  * - `daemon:offline-queue` — daemon-initiated offline queue
40
41
  *
41
42
  * Order is the consent-screen render order: tools-first, I/O second,
42
43
  * control-flow last.
44
+ *
45
+ * `daemon:native-ui:control` is deliberately NOT folded into
46
+ * `daemon:tools:bash`: a token minted to run shell commands must not
47
+ * thereby be able to click around the user's desktop (OSK-11009).
43
48
  */
44
49
  export declare const SCOPES: Readonly<{
45
50
  readonly TOOLS_BASH: "daemon:tools:bash";
46
51
  readonly TOOLS_FS_READ: "daemon:tools:fs:read";
47
52
  readonly TOOLS_FS_WRITE: "daemon:tools:fs:write";
48
53
  readonly BROWSER_CDP: "daemon:browser:cdp";
54
+ readonly NATIVE_UI_CONTROL: "daemon:native-ui:control";
49
55
  readonly SESSION_REPLAY: "daemon:session:replay";
50
56
  readonly OFFLINE_QUEUE: "daemon:offline-queue";
51
57
  }>;
52
58
  export type DaemonScope = (typeof SCOPES)[keyof typeof SCOPES];
53
59
  /**
54
- * The six daemon scopes in canonical order. Frozen so consumers can
60
+ * The seven daemon scopes in canonical order. Frozen so consumers can
55
61
  * pass it directly to OAuth `scope` parameters without defensive
56
62
  * copies.
57
63
  */
@@ -64,7 +70,7 @@ export declare const VALID_DAEMON_SCOPE_SET: ReadonlySet<string>;
64
70
  export declare function isDaemonScope(s: unknown): s is DaemonScope;
65
71
  /**
66
72
  * `cli` — REST-only sign-in grant for first-party CLI clients. Peer
67
- * to the six daemon scopes; lives on `OAuthClient.allowedScopes` for
73
+ * to the daemon scopes; lives on `OAuthClient.allowedScopes` for
68
74
  * the `oversky-cli` client. See the data-schemas canonical for the
69
75
  * full reasoning behind keeping this OUT of `ALL_DAEMON_SCOPES` (the
70
76
  * grandfather sentinel `expandScopes(undefined)` would over-grant).
@@ -29,28 +29,34 @@
29
29
  * never rename in place.
30
30
  */
31
31
  /**
32
- * The canonical daemon scope vocabulary. Six strings, frozen.
32
+ * The canonical daemon scope vocabulary. Seven strings, append-only.
33
33
  *
34
34
  * - `daemon:tools:bash` — bash tool execution
35
35
  * - `daemon:tools:fs:read` — Read tool (file read)
36
36
  * - `daemon:tools:fs:write` — Write + Edit tools (file mutation)
37
37
  * - `daemon:browser:cdp` — browser automation via CDP (reserved)
38
+ * - `daemon:native-ui:control` — native app GUI control via the helper
38
39
  * - `daemon:session:replay` — `daemon:session:replay` socket event
39
40
  * - `daemon:offline-queue` — daemon-initiated offline queue
40
41
  *
41
42
  * Order is the consent-screen render order: tools-first, I/O second,
42
43
  * control-flow last.
44
+ *
45
+ * `daemon:native-ui:control` is deliberately NOT folded into
46
+ * `daemon:tools:bash`: a token minted to run shell commands must not
47
+ * thereby be able to click around the user's desktop (OSK-11009).
43
48
  */
44
49
  export const SCOPES = Object.freeze({
45
50
  TOOLS_BASH: 'daemon:tools:bash',
46
51
  TOOLS_FS_READ: 'daemon:tools:fs:read',
47
52
  TOOLS_FS_WRITE: 'daemon:tools:fs:write',
48
53
  BROWSER_CDP: 'daemon:browser:cdp',
54
+ NATIVE_UI_CONTROL: 'daemon:native-ui:control',
49
55
  SESSION_REPLAY: 'daemon:session:replay',
50
56
  OFFLINE_QUEUE: 'daemon:offline-queue',
51
57
  });
52
58
  /**
53
- * The six daemon scopes in canonical order. Frozen so consumers can
59
+ * The seven daemon scopes in canonical order. Frozen so consumers can
54
60
  * pass it directly to OAuth `scope` parameters without defensive
55
61
  * copies.
56
62
  */
@@ -59,6 +65,7 @@ export const ALL_DAEMON_SCOPES = Object.freeze([
59
65
  SCOPES.TOOLS_FS_READ,
60
66
  SCOPES.TOOLS_FS_WRITE,
61
67
  SCOPES.BROWSER_CDP,
68
+ SCOPES.NATIVE_UI_CONTROL,
62
69
  SCOPES.SESSION_REPLAY,
63
70
  SCOPES.OFFLINE_QUEUE,
64
71
  ]);
@@ -72,7 +79,7 @@ export function isDaemonScope(s) {
72
79
  }
73
80
  /**
74
81
  * `cli` — REST-only sign-in grant for first-party CLI clients. Peer
75
- * to the six daemon scopes; lives on `OAuthClient.allowedScopes` for
82
+ * to the daemon scopes; lives on `OAuthClient.allowedScopes` for
76
83
  * the `oversky-cli` client. See the data-schemas canonical for the
77
84
  * full reasoning behind keeping this OUT of `ALL_DAEMON_SCOPES` (the
78
85
  * grandfather sentinel `expandScopes(undefined)` would over-grant).
@@ -223,7 +223,7 @@ export declare function firstPartyHarnessManifestFile(provider?: string): string
223
223
  * The update feed ORIGIN. Not a product name, and not moved by this identity:
224
224
  * a feed host sits inside signed manifests (naming map §2 "Update feed").
225
225
  */
226
- export declare const FIRST_PARTY_HARNESS_FEED_ORIGIN = "https://updates.oversky.ai";
226
+ export declare const FIRST_PARTY_HARNESS_FEED_ORIGIN = "https://updates.skrr.ai";
227
227
  /** Object-key prefix for one spelling's feed, e.g. `skrr-code/`. */
228
228
  export declare function firstPartyHarnessFeedPrefix(provider?: string): string;
229
229
  /**
@@ -304,7 +304,7 @@ export function firstPartyHarnessManifestFile(provider = FIRST_PARTY_HARNESS.pro
304
304
  * The update feed ORIGIN. Not a product name, and not moved by this identity:
305
305
  * a feed host sits inside signed manifests (naming map §2 "Update feed").
306
306
  */
307
- export const FIRST_PARTY_HARNESS_FEED_ORIGIN = 'https://updates.oversky.ai';
307
+ export const FIRST_PARTY_HARNESS_FEED_ORIGIN = 'https://updates.skrr.ai';
308
308
  /** Object-key prefix for one spelling's feed, e.g. `skrr-code/`. */
309
309
  export function firstPartyHarnessFeedPrefix(provider = FIRST_PARTY_HARNESS.provider) {
310
310
  return `${provider}/`;
@@ -11,7 +11,7 @@ export { configureAuthCore, getAuthLogger, getAuthConfigDir, getAuthKillSwitches
11
11
  export { PermanentAuthFailure, TransientAuthFailure, type PermanentAuthReason, type ReauthState, type TokenPair, } from './types.js';
12
12
  export { decodeJwtExpiry, decodeJwtPayload } from './jwtUtils.js';
13
13
  export { isAuthExpiredSseEvent, handleMidStreamAuthExpiry, type ParsedSseLike, type AuthExpiredCallbacks, type HandleMidStreamAuthExpiryResult, } from './authExpiredDetector.js';
14
- export { formatReauthMessage, EXIT_NEEDS_REAUTH, type AuthFailureReason } from './messages.js';
14
+ export { formatReauthMessage, reauthCommand, EXIT_NEEDS_REAUTH, type AuthFailureReason, } from './messages.js';
15
15
  export { classifyRefreshResponse, type RefreshResponseShape, type ClassifiedRefreshResult, type ClassifiedRefreshSuccess, type ClassifiedRefreshFailure, } from './refreshClassification.js';
16
16
  export { refreshDaemonToken, revokeDaemonRefreshSession, withAuthLock, persistReauthState, needsReauthState, clearReauthState, installLockExitHandlers, __refreshDiagnostics, __resetUnknown401StreaksForTest, UNKNOWN_401_BUDGET, } from './refresh.js';
17
17
  export { createRefreshScheduler, type RefreshScheduler, type RefreshSchedulerOptions, } from './refreshScheduler.js';
@@ -40,6 +40,6 @@ export * from './firstPartyHarness.js';
40
40
  export { FIRST_PARTY_HARNESS_PREVIOUS_SUFFIX, FIRST_PARTY_HARNESS_PROVENANCE_SUFFIX, firstPartyHarnessBinDir, firstPartyHarnessHomeDir, firstPartyHarnessInstalledBinaryPath, linkFirstPartyHarnessAliases, migrateFirstPartyHarnessHome, type FirstPartyHarnessHomeFs, type FirstPartyHarnessHomeMigration, } from './firstPartyHarnessHome.js';
41
41
  export { DEFAULT_FIRST_PARTY_HARNESS_CHANNEL, FIRST_PARTY_HARNESS_CHANNELS, firstPartyHarnessChannelPrefix, firstPartyHarnessFeedBase, firstPartyHarnessFeedCandidates, isFirstPartyHarnessChannel, resolveChannelManifestUrl, resolveFirstPartyHarnessChannel, type FirstPartyHarnessChannel, type FirstPartyHarnessFeedCandidate, } from './firstPartyHarnessChannels.js';
42
42
  export { OVERSKY_RELEASE_PUBLIC_KEYS, type ReleaseKey } from './releaseKeys.js';
43
- export { MAX_SIGS, buildArtifactMessage, buildManifestMessage, getDeltaFor, verifyArtifact, verifyManifest, type DaemonVersionManifest, type DeltaDescriptor, type ManifestSignature, type PlatformArtifact, type VerifyResult, } from './releaseManifest.js';
43
+ export { MAX_SIGS, TRUSTED_FEED_ORIGINS, buildArtifactMessage, buildManifestMessage, getDeltaFor, isTrustedArtifactOrigin, verifyArtifact, verifyManifest, type DaemonVersionManifest, type DeltaDescriptor, type ManifestSignature, type PlatformArtifact, type VerifyResult, } from './releaseManifest.js';
44
44
  export { resolveConfigRoot, configRootPath, isConfigRootOverridden } from './configRoot.js';
45
45
  export { PROFILES_SEGMENT, SUPERSEDED_MARKER_SUFFIX, SUPERSEDED_COPY_SUFFIX, profileStateDir, legacyProfileStateDir, resolveProfileStateDir, resolveProfileStateFile, profileStateFileLocations, profileStateFilePathsToClear, consolidateProfileState, type ResolvedProfileStateDir, type ConsolidationSpec, type ConsolidationStatus, type ConsolidationOutcome, } from './profileStateDir.js';
@@ -23,7 +23,7 @@ export { decodeJwtExpiry, decodeJwtPayload } from './jwtUtils.js';
23
23
  // header.
24
24
  export { isAuthExpiredSseEvent, handleMidStreamAuthExpiry, } from './authExpiredDetector.js';
25
25
  // Reauth messaging
26
- export { formatReauthMessage, EXIT_NEEDS_REAUTH } from './messages.js';
26
+ export { formatReauthMessage, reauthCommand, EXIT_NEEDS_REAUTH, } from './messages.js';
27
27
  // Pure HTTP→{Permanent, Transient, Success} response classification —
28
28
  // exposed so RN-side clients can apply the same mapping daemon uses.
29
29
  export { classifyRefreshResponse, } from './refreshClassification.js';
@@ -161,7 +161,7 @@ export { DEFAULT_FIRST_PARTY_HARNESS_CHANNEL, FIRST_PARTY_HARNESS_CHANNELS, firs
161
161
  // same manifest against the same root. See releaseManifest.ts for why a mirror
162
162
  // would be the wrong shape here.
163
163
  export { OVERSKY_RELEASE_PUBLIC_KEYS } from './releaseKeys.js';
164
- export { MAX_SIGS, buildArtifactMessage, buildManifestMessage, getDeltaFor, verifyArtifact, verifyManifest, } from './releaseManifest.js';
164
+ export { MAX_SIGS, TRUSTED_FEED_ORIGINS, buildArtifactMessage, buildManifestMessage, getDeltaFor, isTrustedArtifactOrigin, verifyArtifact, verifyManifest, } from './releaseManifest.js';
165
165
  // The one definition of the skrr root, shared by `skrr` and `skrrd`. See the
166
166
  // module for why re-deriving it kept producing divergences.
167
167
  export { resolveConfigRoot, configRootPath, isConfigRootOverridden } from './configRoot.js';
@@ -1,4 +1,20 @@
1
1
  export type AuthFailureReason = 'REFRESH_INVALID' | 'REFRESH_REUSED' | 'REFRESH_EXPIRED' | 'SESSION_REVOKED' | 'TOKEN_EXPIRED' | 'TOKEN_INVALID' | 'UNKNOWN_401' | 'UNKNOWN';
2
+ /**
3
+ * The command that recovers this process from a re-auth latch.
4
+ *
5
+ * ONE function owns this, because the answer is printed twice in the same
6
+ * millisecond — once in the human block below and once on the machine-readable
7
+ * `[oversky-reauth]` line a log scraper pages on — and the two used to be
8
+ * written independently. They disagreed: the block said `skrrd login --device`
9
+ * while the error line said `skrr login`, naming a different binary and
10
+ * different flags for one action, so an operator reading either one did
11
+ * something the other did not describe (OSK-10224).
12
+ *
13
+ * The binary is whatever the consumer registered with
14
+ * `configureAuthCore({ binaryName })` — the binary the user actually typed —
15
+ * and `--device` is added only when there is no TTY to open a browser from.
16
+ */
17
+ export declare function reauthCommand(): string;
2
18
  export declare function formatReauthMessage(reason: AuthFailureReason | string): string;
3
19
  /**
4
20
  * Exit code for "permanent auth failure during initial connect" — picked to
@@ -17,17 +17,33 @@ const REASON_HUMAN = {
17
17
  UNKNOWN_401: 'skrr needs you to sign in again.',
18
18
  UNKNOWN: 'skrr needs you to sign in again.',
19
19
  };
20
+ /**
21
+ * The command that recovers this process from a re-auth latch.
22
+ *
23
+ * ONE function owns this, because the answer is printed twice in the same
24
+ * millisecond — once in the human block below and once on the machine-readable
25
+ * `[oversky-reauth]` line a log scraper pages on — and the two used to be
26
+ * written independently. They disagreed: the block said `skrrd login --device`
27
+ * while the error line said `skrr login`, naming a different binary and
28
+ * different flags for one action, so an operator reading either one did
29
+ * something the other did not describe (OSK-10224).
30
+ *
31
+ * The binary is whatever the consumer registered with
32
+ * `configureAuthCore({ binaryName })` — the binary the user actually typed —
33
+ * and `--device` is added only when there is no TTY to open a browser from.
34
+ */
35
+ export function reauthCommand() {
36
+ const bin = getAuthBinaryName();
37
+ return process.stdout.isTTY ? `${bin} login` : `${bin} login --device`;
38
+ }
20
39
  export function formatReauthMessage(reason) {
21
40
  const norm = REASON_HUMAN[reason] || REASON_HUMAN.UNKNOWN;
22
- const isHeadless = !process.stdout.isTTY;
23
- const bin = getAuthBinaryName();
24
- const cmd = isHeadless ? `${bin} login --device` : `${bin} login`;
25
41
  return [
26
42
  '',
27
43
  'skrr cannot connect — re-authentication required.',
28
44
  ` Reason: ${norm}`,
29
45
  '',
30
- ` To continue, run: ${cmd}`,
46
+ ` To continue, run: ${reauthCommand()}`,
31
47
  '',
32
48
  ].join('\n');
33
49
  }
@@ -159,3 +159,41 @@ export declare function verifyManifest(manifest: DaemonVersionManifest, keys?: r
159
159
  * against the signed `artifact.sha256`, not from this metadata).
160
160
  */
161
161
  export declare function getDeltaFor(artifact: PlatformArtifact, fromVersion: string): DeltaDescriptor | null;
162
+ /**
163
+ * Origins an artifact may be served from, beyond the feed base this run used.
164
+ *
165
+ * WHY A SET AND NOT THE ONE ORIGIN
166
+ * --------------------------------
167
+ * The pin used to require the artifact origin to EQUAL the feed base's
168
+ * origin. That is correct with one host and unsatisfiable with two, which the
169
+ * skrr rename creates:
170
+ *
171
+ * - a shipped daemon/CLI has `updates.oversky.ai` compiled in, so a manifest
172
+ * advertising skrr.ai artifacts is refused and it can never self-update
173
+ * again — including to the build that would have fixed it;
174
+ * - a new build shipping `updates.skrr.ai` refuses the SAME manifest for the
175
+ * mirror-image reason.
176
+ *
177
+ * One manifest of absolute URLs therefore cannot serve both, and the update
178
+ * path is the one thing that must not break: a client that cannot update
179
+ * cannot be repaired remotely.
180
+ *
181
+ * Widening to a small, closed set of origins we publish keeps the property the
182
+ * pin exists for: with keys pinned the ed25519 signature already binds the
183
+ * URL, and this is defence-in-depth for when verification is disabled —
184
+ * stopping a manifest-integrity failure from redirecting a download to an
185
+ * ARBITRARY origin serving a hash-matching payload. An attacker gains nothing
186
+ * from a second origin that is also ours.
187
+ *
188
+ * Both entries are removed down to one when no shipped client uses the old
189
+ * host, per the add -> verify -> remove ordering.
190
+ */
191
+ export declare const TRUSTED_FEED_ORIGINS: readonly string[];
192
+ /**
193
+ * True when `candidate` may serve an artifact for a feed rooted at `feedBase`.
194
+ *
195
+ * The feed base's own origin always passes, so an override
196
+ * (OVERSKY_DAEMON_UPDATE_FEED_BASE, a canary, a test server) keeps working
197
+ * without being listed here.
198
+ */
199
+ export declare function isTrustedArtifactOrigin(candidate: string, feedBase: string): boolean;
@@ -225,3 +225,67 @@ export function getDeltaFor(artifact, fromVersion) {
225
225
  }
226
226
  return d;
227
227
  }
228
+ // ---------------------------------------------------------------------------
229
+ // Trusted artifact origins
230
+ // ---------------------------------------------------------------------------
231
+ /**
232
+ * Origins an artifact may be served from, beyond the feed base this run used.
233
+ *
234
+ * WHY A SET AND NOT THE ONE ORIGIN
235
+ * --------------------------------
236
+ * The pin used to require the artifact origin to EQUAL the feed base's
237
+ * origin. That is correct with one host and unsatisfiable with two, which the
238
+ * skrr rename creates:
239
+ *
240
+ * - a shipped daemon/CLI has `updates.oversky.ai` compiled in, so a manifest
241
+ * advertising skrr.ai artifacts is refused and it can never self-update
242
+ * again — including to the build that would have fixed it;
243
+ * - a new build shipping `updates.skrr.ai` refuses the SAME manifest for the
244
+ * mirror-image reason.
245
+ *
246
+ * One manifest of absolute URLs therefore cannot serve both, and the update
247
+ * path is the one thing that must not break: a client that cannot update
248
+ * cannot be repaired remotely.
249
+ *
250
+ * Widening to a small, closed set of origins we publish keeps the property the
251
+ * pin exists for: with keys pinned the ed25519 signature already binds the
252
+ * URL, and this is defence-in-depth for when verification is disabled —
253
+ * stopping a manifest-integrity failure from redirecting a download to an
254
+ * ARBITRARY origin serving a hash-matching payload. An attacker gains nothing
255
+ * from a second origin that is also ours.
256
+ *
257
+ * Both entries are removed down to one when no shipped client uses the old
258
+ * host, per the add -> verify -> remove ordering.
259
+ */
260
+ export const TRUSTED_FEED_ORIGINS = [
261
+ 'https://updates.oversky.ai',
262
+ 'https://updates.skrr.ai',
263
+ ];
264
+ /**
265
+ * True when `candidate` may serve an artifact for a feed rooted at `feedBase`.
266
+ *
267
+ * The feed base's own origin always passes, so an override
268
+ * (OVERSKY_DAEMON_UPDATE_FEED_BASE, a canary, a test server) keeps working
269
+ * without being listed here.
270
+ */
271
+ export function isTrustedArtifactOrigin(candidate, feedBase) {
272
+ let feedOrigin;
273
+ try {
274
+ feedOrigin = new URL(feedBase).origin;
275
+ }
276
+ catch {
277
+ return false;
278
+ }
279
+ // Callers hand over either a bare origin (the daemon's self-updater) or a
280
+ // full artifact URL (the CLI installer) — both spell the same check.
281
+ let candidateOrigin = candidate;
282
+ try {
283
+ candidateOrigin = new URL(candidate).origin;
284
+ }
285
+ catch {
286
+ /* not a URL — compare raw; it will not match anything */
287
+ }
288
+ if (candidateOrigin === feedOrigin)
289
+ return true;
290
+ return TRUSTED_FEED_ORIGINS.includes(candidateOrigin);
291
+ }
@@ -75,7 +75,7 @@ export declare const SENSITIVE_ENV_SUFFIXES: readonly string[];
75
75
  * `SECRETARY` untouched.
76
76
  */
77
77
  export declare const SENSITIVE_ENV_NAME_TOKENS: readonly string[];
78
- /** Specific OVERSKY_ vars to keep (the prefix sweep is broad on purpose). */
78
+ /** Specific names to keep — the prefix sweeps are broad on purpose. */
79
79
  export declare const SENSITIVE_ENV_PREFIX_EXCEPTIONS: ReadonlySet<string>;
80
80
  /**
81
81
  * Build a sanitized snapshot of the parent's own env for a spawned
@@ -57,6 +57,9 @@
57
57
  export const SENSITIVE_ENV_VARS = new Set([
58
58
  'CLAUDE_CODE_OAUTH_TOKEN',
59
59
  'OVERSKY_TOKEN',
60
+ // The renamed credential alias (cli/src/lib/config.ts honors both spellings).
61
+ // Same double coverage as OVERSKY_TOKEN — name AND the SKRR_ prefix below.
62
+ 'SKRR_TOKEN',
60
63
  'AWS_ACCESS_KEY_ID',
61
64
  'AWS_SECRET_ACCESS_KEY',
62
65
  'AWS_SESSION_TOKEN',
@@ -87,7 +90,16 @@ export const SENSITIVE_ENV_VARS = new Set([
87
90
  'LD_PRELOAD',
88
91
  ]);
89
92
  /** Variable name prefixes that should be stripped (catches families like AWS_*). */
90
- export const SENSITIVE_ENV_PREFIXES = ['AWS_', 'OVERSKY_'];
93
+ export const SENSITIVE_ENV_PREFIXES = [
94
+ 'AWS_',
95
+ 'OVERSKY_',
96
+ // The renamed product namespace: SKRR_TOKEN, SKRR_REFRESH_TOKEN, the
97
+ // session-authority aliases (SKRR_SESSION_*, SKRR_BASE_URL), and the
98
+ // daemon's control-plane identity (SKRR_MACHINE_UUID, SKRR_LEASE_GENERATION)
99
+ // all carry authority a model-driven child must not inherit. Non-secret
100
+ // lane essentials live in SENSITIVE_ENV_PREFIX_EXCEPTIONS below.
101
+ 'SKRR_',
102
+ ];
91
103
  /**
92
104
  * Credential-shaped suffixes are also forbidden. A fixed provider list is
93
105
  * never complete: a newly configured provider would otherwise leak its key
@@ -116,7 +128,7 @@ export const SENSITIVE_ENV_SUFFIXES = [
116
128
  * `SECRETARY` untouched.
117
129
  */
118
130
  export const SENSITIVE_ENV_NAME_TOKENS = ['SECRET'];
119
- /** Specific OVERSKY_ vars to keep (the prefix sweep is broad on purpose). */
131
+ /** Specific names to keep — the prefix sweeps are broad on purpose. */
120
132
  export const SENSITIVE_ENV_PREFIX_EXCEPTIONS = new Set([
121
133
  // Headless flag is read by spawned tools to know they're inside the daemon —
122
134
  // not a secret. Add more here if a tool legitimately needs an OVERSKY_ var.
@@ -126,6 +138,16 @@ export const SENSITIVE_ENV_PREFIX_EXCEPTIONS = new Set([
126
138
  // know they're inside a supervised daemon on Linux/Windows in addition
127
139
  // to macOS launchd. Not a secret.
128
140
  'OVERSKY_SUPERVISOR',
141
+ // A deployment URL, not a credential. The rename to SKRR_SERVER_URL was
142
+ // chosen precisely because it survives the sanitizer
143
+ // (daemon/src/dedicated-tenant-env.ts), so a spawned lane's `skrr` reaches
144
+ // the deployment this machine is registered with.
145
+ 'SKRR_SERVER_URL',
146
+ // The Dedicated Runtime workload marker the exec wrapper stamps into every
147
+ // tenant lane; grandchildren spawned from a lane (e.g. `skrr code` → the
148
+ // engine) must keep it to detect they already run as the workload uid. Not
149
+ // a secret — it authorizes nothing without the matching real uid.
150
+ 'SKRR_WORKLOAD_UID',
129
151
  ]);
130
152
  /**
131
153
  * Build a sanitized snapshot of the parent's own env for a spawned
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skrr-ai/auth-core",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "main": "dist/cjs/index.js",
5
5
  "types": "dist/esm/index.d.ts",
6
6
  "exports": {