@rightkit/release 0.2.135 → 0.2.136

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 (81) hide show
  1. package/README.md +62 -0
  2. package/addon-command.mjs +53 -34
  3. package/apple-profile-renew.mjs +30 -12
  4. package/artifact-storage.mjs +47 -10
  5. package/background-process.mjs +18 -0
  6. package/build-release.mjs +1 -1
  7. package/cache-command.mjs +4 -3
  8. package/cargo-contract.mjs +1 -1
  9. package/cargo-guard.mjs +4 -3
  10. package/cargo-registry-readback.mjs +51 -0
  11. package/cargo-target.mjs +3 -1
  12. package/cli/right-release.mjs +26 -0
  13. package/codesign-environment.mjs +26 -2
  14. package/codesign-shim.mjs +2 -1
  15. package/committed-source.mjs +3 -3
  16. package/development.mjs +7 -7
  17. package/direct-bootstrap.mjs +19 -9
  18. package/dmg-build.mjs +117 -0
  19. package/dmg-layout.mjs +123 -0
  20. package/github-release.mjs +74 -37
  21. package/heavy-command.mjs +3 -2
  22. package/install-app.mjs +358 -0
  23. package/inventory-check.mjs +980 -0
  24. package/macos-signing-session.mjs +3 -0
  25. package/managed-cargo.mjs +23 -19
  26. package/managed-host-secrets.mjs +30 -0
  27. package/managed-roots.mjs +39 -0
  28. package/model-promote.mjs +31 -37
  29. package/notary-auth.mjs +4 -0
  30. package/osascript-guard.mjs +24 -0
  31. package/ownership-approval-command.mjs +15 -4
  32. package/ownership-approval.mjs +114 -49
  33. package/ownership-availability.mjs +25 -0
  34. package/ownership-catalog-config.json +18 -0
  35. package/ownership-catalog.mjs +94 -0
  36. package/ownership-command.mjs +17 -10
  37. package/ownership-declaration.json +15 -0
  38. package/ownership-default-policy.json +1 -11
  39. package/ownership-evidence.mjs +10 -8
  40. package/ownership-git-inventory.mjs +29 -1
  41. package/ownership-helper-paths.json +2 -2
  42. package/ownership-hooks.mjs +107 -0
  43. package/ownership-internal-owners.json +44 -0
  44. package/ownership-key-authority.mjs +112 -7
  45. package/ownership-key-command.mjs +76 -19
  46. package/ownership-key-trust.mjs +97 -9
  47. package/ownership-lockfiles.mjs +311 -0
  48. package/ownership-report-command.mjs +12 -3
  49. package/ownership-report.mjs +20 -17
  50. package/ownership-repositories.json +19 -0
  51. package/ownership-scan-worker.mjs +96 -11
  52. package/ownership-source.mjs +39 -0
  53. package/ownership-staged.mjs +193 -0
  54. package/ownership-verdict.mjs +74 -0
  55. package/ownership.mjs +215 -107
  56. package/package.json +1 -1
  57. package/protected-credentials.mjs +111 -0
  58. package/prune-r2.mjs +4 -3
  59. package/pub-upload.mjs +3 -85
  60. package/publication-artifacts.mjs +108 -0
  61. package/publication-gate.mjs +28 -7
  62. package/publish-cargo.mjs +47 -16
  63. package/publish-swift.mjs +46 -17
  64. package/publish-update.mjs +61 -39
  65. package/r2-verified-upload.mjs +41 -0
  66. package/registry-parity.mjs +5 -3
  67. package/release-state.mjs +1 -0
  68. package/release-token.mjs +2 -0
  69. package/rightkit-drift.mjs +3 -2
  70. package/rightkit-ownership.json +2028 -139
  71. package/rightkit-signing-agent.mjs +5 -3
  72. package/rightkit-sync.mjs +6 -2
  73. package/rightkit-versions.json +213 -103
  74. package/runtime-artifact-manifest.mjs +20 -6
  75. package/sign-updater.mjs +5 -0
  76. package/signing-agent-client.mjs +2 -1
  77. package/signing-agent-install.mjs +3 -2
  78. package/standalone-clone-verify.mjs +3 -2
  79. package/tauri-bundle-marker.mjs +3 -2
  80. package/upload-large.mjs +36 -82
  81. package/verifier.mjs +5 -1
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { resolveManagedRoots } from './managed-roots.mjs';
2
3
  import * as fs from "node:fs";
3
4
  import net from "node:net";
4
5
  import os from "node:os";
@@ -17,12 +18,12 @@ export class SigningAgentError extends Error {
17
18
  }
18
19
  const fail = (code, message) => { throw new SigningAgentError(code, message); };
19
20
  export function signingAgentPaths(home = os.userInfo().homedir) {
20
- const directory = path.join(home, "Library/Application Support/Orthic Labs/shared/signing-agent");
21
+ const directory = resolveManagedRoots({ platform: "darwin", home }).signingAgent;
21
22
  return { directory, socket: path.join(directory, "agent.sock"), token: path.join(directory, "token"),
22
23
  config: path.join(directory, "config.json"), runtime: path.join(directory, "runtime"),
23
24
  log: path.join(directory, "requests.jsonl"), plist: path.join(home, "Library/LaunchAgents", `${AGENT_LABEL}.plist`) };
24
25
  }
25
- export function defaultSigningRoots(home = os.userInfo().homedir, managedRoot = "/Volumes/D/.rightkit-managed", cargoTargetDirs = []) {
26
+ export function defaultSigningRoots(home = os.userInfo().homedir, managedRoot = resolveManagedRoots({ home }).dataRoot, cargoTargetDirs = []) {
26
27
  return [...new Set(["/Volumes/D/claude", managedRoot, "/Volumes/D/rightkit-build-control",
27
28
  path.join(home, "Library/Caches/RightSuite/release"), "/tmp", "/private/tmp", os.tmpdir(), ...cargoTargetDirs])];
28
29
  }
@@ -380,7 +381,8 @@ export async function startSigningAgent({ paths = signingAgentPaths(), config, i
380
381
  server.on("error", () => { log({ event: "service.failed", code: "MAC_SIGNING_AGENT_SOCKET" }); });
381
382
  return server;
382
383
  }
383
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
384
+ const realOrSelf = (file) => { try { return fs.realpathSync(file); } catch { return path.resolve(file); } };
385
+ if (process.argv[1] && realOrSelf(process.argv[1]) === realOrSelf(fileURLToPath(import.meta.url))) {
384
386
  process.umask(0o077);
385
387
  startSigningAgent().then((server) => {
386
388
  const stop = () => { managedSigningLog(signingAgentPaths().log, { event: "service.stopping" }); server.close(() => process.exit(0)); setTimeout(() => process.exit(0), 2000).unref(); };
package/rightkit-sync.mjs CHANGED
@@ -3,7 +3,7 @@
3
3
  // Every publishable crate under crates/ and package under packages/ is looked up; a newer
4
4
  // published version becomes the staged (latest) version and the one it replaces stays allowed
5
5
  // in legacyCargo / legacyNpm, so apps pinned to it keep validating until they adopt.
6
- import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
6
+ import { existsSync, readFileSync, readdirSync, writeFileSync, realpathSync } from "node:fs";
7
7
  import path from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
9
 
@@ -189,6 +189,9 @@ export function syncConsumerCopies(root = rightkitRoot) {
189
189
  ["rightkit-versions.json", path.join(root, "packages", "build-control-policy", "src", "ownership-session-versions.json")],
190
190
  ["rightkit-drift.mjs", path.join(root, "packages", "build-control-policy", "src", "rightkit-drift.mjs")],
191
191
  ["background-process.mjs", path.join(root, "packages", "build-control-policy", "src", "background-process.mjs")],
192
+ ["ownership-source.mjs", path.join(root, "packages", "build-control-policy", "src", "ownership-source.mjs")],
193
+ ["ownership-availability.mjs", path.join(root, "packages", "build-control-policy", "src", "ownership-availability.mjs")],
194
+ ["ownership-availability.mjs", path.join(root, "packages", "build-control-clients", "src", "ownership-availability.mjs")],
192
195
  ];
193
196
  const updated = [];
194
197
  for (const [source, target] of targets) {
@@ -201,7 +204,8 @@ export function syncConsumerCopies(root = rightkitRoot) {
201
204
  return updated;
202
205
  }
203
206
 
204
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
207
+ const realOrSelf = (file) => { try { return realpathSync(file); } catch { return path.resolve(file); } };
208
+ if (process.argv[1] && realOrSelf(process.argv[1]) === realOrSelf(fileURLToPath(import.meta.url))) {
205
209
  const main = async () => {
206
210
  const args = process.argv.slice(2);
207
211
  if (args[0] === "stage") {
@@ -13,28 +13,28 @@
13
13
  "@rightkit/updates": "0.2.3"
14
14
  },
15
15
  "stagedNpm": {
16
- "@rightkit/app-shell": "0.2.1",
16
+ "@rightkit/app-shell": "0.3.0",
17
17
  "@rightkit/ax": "0.2.4",
18
- "@rightkit/doc-render": "0.1.3",
19
- "@rightkit/git": "0.2.26",
20
- "@rightkit/hooks": "0.1.1",
18
+ "@rightkit/doc-render": "0.1.4",
19
+ "@rightkit/git": "0.2.29",
20
+ "@rightkit/hooks": "0.1.2",
21
21
  "@rightkit/i18n": "0.1.0",
22
22
  "@rightkit/legal": "0.3.1",
23
- "@rightkit/legal-ui": "0.1.3",
23
+ "@rightkit/legal-ui": "0.2.0",
24
24
  "@rightkit/license": "0.1.8",
25
25
  "@rightkit/logs": "0.1.4",
26
- "@rightkit/media-ui": "0.2.6",
27
- "@rightkit/onboarding": "0.2.3",
26
+ "@rightkit/media-ui": "0.3.0",
27
+ "@rightkit/onboarding": "0.3.0",
28
28
  "@rightkit/pdf-ui": "0.1.2",
29
- "@rightkit/platform-ui": "0.1.2",
30
- "@rightkit/qa": "0.3.2",
29
+ "@rightkit/platform-ui": "0.2.0",
30
+ "@rightkit/qa": "0.4.0",
31
31
  "@rightkit/qa-chrome": "0.1.3",
32
- "@rightkit/release": "0.2.135",
33
- "@rightkit/settings-ui": "0.2.7",
32
+ "@rightkit/release": "0.2.136",
33
+ "@rightkit/settings-ui": "0.3.0",
34
34
  "@rightkit/shell": "0.1.0",
35
- "@rightkit/tauri": "0.1.1",
35
+ "@rightkit/tauri": "0.2.0",
36
36
  "@rightkit/theme": "0.2.1",
37
- "@rightkit/updates": "0.2.4"
37
+ "@rightkit/updates": "0.2.5"
38
38
  },
39
39
  "legacyNpm": {
40
40
  "@rightkit/ax": [
@@ -67,15 +67,20 @@
67
67
  "0.2.22",
68
68
  "0.2.23",
69
69
  "0.2.24",
70
- "0.2.25"
70
+ "0.2.25",
71
+ "0.2.26",
72
+ "0.2.27",
73
+ "0.2.28"
71
74
  ],
72
75
  "@rightkit/legal-ui": [
73
76
  "0.1.0",
74
77
  "0.1.1",
75
- "0.1.2"
78
+ "0.1.2",
79
+ "0.1.3"
76
80
  ],
77
81
  "@rightkit/hooks": [
78
- "0.1.0"
82
+ "0.1.0",
83
+ "0.1.1"
79
84
  ],
80
85
  "@rightkit/legal": [
81
86
  "0.3.0"
@@ -158,7 +163,8 @@
158
163
  "0.2.131",
159
164
  "0.2.132",
160
165
  "0.2.133",
161
- "0.2.134"
166
+ "0.2.134",
167
+ "0.2.135"
162
168
  ],
163
169
  "@rightkit/qa": [
164
170
  "0.1.0",
@@ -168,11 +174,13 @@
168
174
  "0.2.3",
169
175
  "0.2.4",
170
176
  "0.3.0",
171
- "0.3.1"
177
+ "0.3.1",
178
+ "0.3.2"
172
179
  ],
173
180
  "@rightkit/app-shell": [
174
181
  "0.1.0",
175
- "0.2.0"
182
+ "0.2.0",
183
+ "0.2.1"
176
184
  ],
177
185
  "@rightkit/media-ui": [
178
186
  "0.1.0",
@@ -181,7 +189,8 @@
181
189
  "0.2.2",
182
190
  "0.2.3",
183
191
  "0.2.4",
184
- "0.2.5"
192
+ "0.2.5",
193
+ "0.2.6"
185
194
  ],
186
195
  "@rightkit/theme": [
187
196
  "0.1.0",
@@ -194,21 +203,25 @@
194
203
  "0.2.3",
195
204
  "0.2.4",
196
205
  "0.2.5",
197
- "0.2.6"
206
+ "0.2.6",
207
+ "0.2.7"
198
208
  ],
199
209
  "@rightkit/onboarding": [
200
210
  "0.1.0",
201
211
  "0.2.0",
202
212
  "0.2.1",
203
- "0.2.2"
213
+ "0.2.2",
214
+ "0.2.3"
204
215
  ],
205
216
  "@rightkit/doc-render": [
206
217
  "0.1.0",
207
218
  "0.1.1",
208
- "0.1.2"
219
+ "0.1.2",
220
+ "0.1.3"
209
221
  ],
210
222
  "@rightkit/platform-ui": [
211
- "0.1.1"
223
+ "0.1.1",
224
+ "0.1.2"
212
225
  ],
213
226
  "@rightkit/pdf-ui": [
214
227
  "0.1.0",
@@ -218,6 +231,12 @@
218
231
  "0.1.0",
219
232
  "0.1.1",
220
233
  "0.1.2"
234
+ ],
235
+ "@rightkit/updates": [
236
+ "0.2.4"
237
+ ],
238
+ "@rightkit/tauri": [
239
+ "0.1.1"
221
240
  ]
222
241
  },
223
242
  "cargo": {
@@ -238,41 +257,50 @@
238
257
  "rightkit-tauri": "0.1.0"
239
258
  },
240
259
  "stagedCargo": {
241
- "rightkit-audio": "0.1.1",
260
+ "agent-room-core": "0.3.0",
261
+ "rightkit-asr": "0.0.2",
262
+ "rightkit-audio": "0.2.0",
242
263
  "rightkit-automation": "0.1.0",
243
- "rightkit-browser": "0.2.2",
264
+ "rightkit-browser": "0.2.3",
244
265
  "rightkit-cache": "0.1.0",
266
+ "rightkit-contracts": "0.1.2",
245
267
  "rightkit-control": "0.1.9",
246
- "rightkit-crash": "0.1.0",
247
- "rightkit-db": "0.3.0",
248
- "rightkit-embed": "0.2.2",
268
+ "rightkit-crash": "0.2.0",
269
+ "rightkit-db": "0.3.2",
270
+ "rightkit-embed": "0.3.1",
249
271
  "rightkit-framed-sidecar": "0.1.0",
250
- "rightkit-fs": "0.1.0",
251
- "rightkit-http": "0.1.0",
252
- "rightkit-jobs": "0.2.2",
272
+ "rightkit-fs": "0.3.2",
273
+ "rightkit-fsindex": "0.1.0",
274
+ "rightkit-http": "0.2.2",
275
+ "rightkit-jobs": "0.2.6",
253
276
  "rightkit-license": "0.1.3",
254
277
  "rightkit-logs": "0.2.0",
255
- "rightkit-mcp": "0.3.1",
256
- "rightkit-media": "0.2.3",
257
- "rightkit-models": "0.2.2",
258
- "rightkit-oauth": "0.2.1",
259
- "rightkit-ort": "0.2.0",
260
- "rightkit-pdf": "0.1.0",
278
+ "rightkit-mcp": "0.5.1",
279
+ "rightkit-media": "0.2.4",
280
+ "rightkit-models": "0.2.7",
281
+ "rightkit-oauth": "0.3.0",
282
+ "rightkit-ocr": "0.1.2",
283
+ "rightkit-ort": "0.2.2",
284
+ "rightkit-ownership": "0.2.0",
285
+ "rightkit-pdf": "0.2.0",
261
286
  "rightkit-playback": "0.1.1",
262
- "rightkit-process": "0.3.1",
263
- "rightkit-qa": "0.2.12",
264
- "rightkit-qts": "0.2.1",
265
- "rightkit-qts-ggml": "0.1.0",
266
- "rightkit-qts-ggml-sys": "0.1.0",
267
- "rightkit-sandbox": "0.2.4",
268
- "rightkit-search": "0.1.0",
269
- "rightkit-secrets": "0.1.0",
270
- "rightkit-service": "0.1.0",
287
+ "rightkit-process": "0.3.3",
288
+ "rightkit-qa": "0.2.14",
289
+ "rightkit-qts": "0.2.4",
290
+ "rightkit-qts-ggml": "0.1.1",
291
+ "rightkit-qts-ggml-sys": "0.1.1",
292
+ "rightkit-sandbox": "0.3.3",
293
+ "rightkit-search": "0.2.0",
294
+ "rightkit-secrets": "0.1.2",
295
+ "rightkit-service": "0.1.3",
271
296
  "rightkit-settings": "0.1.0",
272
- "rightkit-shell": "0.1.3",
273
- "rightkit-speech-client": "0.3.0",
297
+ "rightkit-shell": "0.1.4",
298
+ "rightkit-speech-client": "0.3.2",
274
299
  "rightkit-sync": "0.1.0",
275
- "rightkit-tauri": "0.1.1",
300
+ "rightkit-tauri": "0.1.2",
301
+ "rightkit-transcript": "0.1.0",
302
+ "rightkit-tts": "0.1.0",
303
+ "rightkit-vad": "0.0.2",
276
304
  "rightkit-watch": "0.3.1"
277
305
  },
278
306
  "swift": {
@@ -289,125 +317,162 @@
289
317
  },
290
318
  "registry": {
291
319
  "cargo": {
292
- "rightkit-audio": "0.1.1",
320
+ "rightkit-asr": "0.0.2",
321
+ "rightkit-audio": "0.2.0",
293
322
  "rightkit-browser": "0.2.2",
294
323
  "rightkit-cache": "0.1.0",
295
324
  "rightkit-control": "0.1.9",
296
- "rightkit-crash": "0.1.0",
297
- "rightkit-db": "0.3.0",
298
- "rightkit-embed": "0.2.2",
325
+ "rightkit-crash": "0.2.0",
326
+ "rightkit-db": "0.3.2",
327
+ "rightkit-embed": "0.3.1",
299
328
  "rightkit-framed-sidecar": "0.1.0",
300
- "rightkit-fs": "0.1.0",
301
- "rightkit-http": "0.1.0",
302
- "rightkit-jobs": "0.2.2",
329
+ "rightkit-fs": "0.3.2",
330
+ "rightkit-fsindex": "0.1.0",
331
+ "rightkit-http": "0.2.2",
332
+ "rightkit-jobs": "0.2.6",
303
333
  "rightkit-license": "0.1.3",
304
334
  "rightkit-logs": "0.2.0",
305
- "rightkit-mcp": "0.3.1",
306
- "rightkit-media": "0.2.3",
307
- "rightkit-models": "0.2.2",
308
- "rightkit-oauth": "0.2.1",
309
- "rightkit-ort": "0.2.0",
310
- "rightkit-pdf": "0.1.0",
335
+ "rightkit-mcp": "0.5.1",
336
+ "rightkit-media": "0.2.4",
337
+ "rightkit-models": "0.2.7",
338
+ "rightkit-oauth": "0.3.0",
339
+ "rightkit-ocr": "0.1.2",
340
+ "rightkit-ort": "0.2.2",
341
+ "rightkit-ownership": "0.2.0",
342
+ "rightkit-pdf": "0.2.0",
311
343
  "rightkit-playback": "0.1.1",
312
- "rightkit-process": "0.3.1",
313
- "rightkit-qa": "0.2.12",
314
- "rightkit-qts": "0.2.1",
315
- "rightkit-qts-ggml": "0.1.0",
316
- "rightkit-qts-ggml-sys": "0.1.0",
317
- "rightkit-sandbox": "0.2.4",
318
- "rightkit-search": "0.1.0",
319
- "rightkit-secrets": "0.1.0",
320
- "rightkit-service": "0.1.0",
344
+ "rightkit-process": "0.3.3",
345
+ "rightkit-qa": "0.2.14",
346
+ "rightkit-qts": "0.2.4",
347
+ "rightkit-qts-ggml": "0.1.1",
348
+ "rightkit-qts-ggml-sys": "0.1.1",
349
+ "rightkit-sandbox": "0.3.3",
350
+ "rightkit-search": "0.2.0",
351
+ "rightkit-secrets": "0.1.2",
352
+ "rightkit-service": "0.1.3",
321
353
  "rightkit-settings": "0.1.0",
322
- "rightkit-shell": "0.1.3",
323
- "rightkit-speech-client": "0.3.0",
324
- "rightkit-tauri": "0.1.1",
354
+ "rightkit-shell": "0.1.4",
355
+ "rightkit-speech-client": "0.3.2",
356
+ "rightkit-tauri": "0.1.2",
357
+ "rightkit-transcript": "0.1.0",
358
+ "rightkit-tts": "0.1.0",
359
+ "rightkit-vad": "0.0.2",
325
360
  "rightkit-watch": "0.3.1"
326
361
  },
327
362
  "npm": {
328
- "@rightkit/app-shell": "0.2.1",
363
+ "@rightkit/app-shell": "0.3.0",
329
364
  "@rightkit/ax": "0.2.4",
330
- "@rightkit/doc-render": "0.1.3",
331
- "@rightkit/git": "0.2.26",
332
- "@rightkit/hooks": "0.1.1",
365
+ "@rightkit/doc-render": "0.1.4",
366
+ "@rightkit/git": "0.2.29",
367
+ "@rightkit/hooks": "0.1.2",
333
368
  "@rightkit/i18n": "0.1.0",
334
369
  "@rightkit/legal": "0.3.1",
335
- "@rightkit/legal-ui": "0.1.3",
370
+ "@rightkit/legal-ui": "0.2.0",
336
371
  "@rightkit/license": "0.1.8",
337
372
  "@rightkit/logs": "0.1.4",
338
- "@rightkit/media-ui": "0.2.6",
339
- "@rightkit/onboarding": "0.2.3",
373
+ "@rightkit/media-ui": "0.3.0",
374
+ "@rightkit/onboarding": "0.3.0",
340
375
  "@rightkit/pdf-ui": "0.1.2",
341
- "@rightkit/platform-ui": "0.1.2",
342
- "@rightkit/qa": "0.3.2",
376
+ "@rightkit/platform-ui": "0.2.0",
377
+ "@rightkit/qa": "0.4.0",
343
378
  "@rightkit/qa-chrome": "0.1.3",
344
- "@rightkit/release": "0.2.134",
345
- "@rightkit/settings-ui": "0.2.7",
379
+ "@rightkit/release": "0.2.136",
380
+ "@rightkit/settings-ui": "0.3.0",
346
381
  "@rightkit/shell": "0.1.0",
347
- "@rightkit/tauri": "0.1.1",
382
+ "@rightkit/tauri": "0.2.0",
348
383
  "@rightkit/theme": "0.2.1",
349
- "@rightkit/updates": "0.2.4"
384
+ "@rightkit/updates": "0.2.5"
350
385
  }
351
386
  },
352
387
  "legacyCargo": {
353
388
  "rightkit-browser": [
354
389
  "0.2.0",
355
- "0.2.1"
390
+ "0.2.1",
391
+ "0.2.2"
356
392
  ],
357
393
  "rightkit-models": [
358
- "0.2.1"
394
+ "0.2.1",
395
+ "0.2.2",
396
+ "0.2.3",
397
+ "0.2.4",
398
+ "0.2.5",
399
+ "0.2.6"
359
400
  ],
360
401
  "rightkit-audio": [
361
- "0.1.0"
402
+ "0.1.0",
403
+ "0.1.1"
362
404
  ],
363
405
  "rightkit-db": [
364
- "0.2.1"
406
+ "0.2.1",
407
+ "0.3.0",
408
+ "0.3.1"
365
409
  ],
366
410
  "rightkit-embed": [
367
- "0.2.1"
411
+ "0.2.1",
412
+ "0.2.2",
413
+ "0.3.0"
368
414
  ],
369
415
  "rightkit-jobs": [
370
- "0.2.1"
416
+ "0.2.1",
417
+ "0.2.2",
418
+ "0.2.3",
419
+ "0.2.4",
420
+ "0.2.5"
371
421
  ],
372
422
  "rightkit-mcp": [
373
423
  "0.1.1",
374
424
  "0.2.0",
375
- "0.3.0"
425
+ "0.3.0",
426
+ "0.3.1",
427
+ "0.4.0",
428
+ "0.5.0"
376
429
  ],
377
430
  "rightkit-media": [
378
- "0.2.2"
431
+ "0.2.2",
432
+ "0.2.3"
379
433
  ],
380
434
  "rightkit-oauth": [
381
- "0.2.0"
435
+ "0.2.0",
436
+ "0.2.1"
382
437
  ],
383
438
  "rightkit-ort": [
384
- "0.1.4"
439
+ "0.1.4",
440
+ "0.2.0",
441
+ "0.2.1"
385
442
  ],
386
443
  "rightkit-playback": [
387
444
  "0.1.0"
388
445
  ],
389
446
  "rightkit-process": [
390
447
  "0.2.1",
391
- "0.3.0"
448
+ "0.3.0",
449
+ "0.3.1",
450
+ "0.3.2"
392
451
  ],
393
452
  "rightkit-qa": [
394
453
  "0.2.7",
395
454
  "0.2.8",
396
455
  "0.2.9",
397
456
  "0.2.10",
398
- "0.2.11"
457
+ "0.2.11",
458
+ "0.2.12"
399
459
  ],
400
460
  "rightkit-sandbox": [
401
461
  "0.1.0",
402
462
  "0.2.0",
403
463
  "0.2.1",
404
464
  "0.2.2",
405
- "0.2.3"
465
+ "0.2.3",
466
+ "0.2.4",
467
+ "0.3.0",
468
+ "0.3.1",
469
+ "0.3.2"
406
470
  ],
407
471
  "rightkit-shell": [
408
472
  "0.1.0",
409
473
  "0.1.1",
410
- "0.1.2"
474
+ "0.1.2",
475
+ "0.1.3"
411
476
  ],
412
477
  "rightkit-watch": [
413
478
  "0.1.0",
@@ -415,12 +480,57 @@
415
480
  "0.3.0"
416
481
  ],
417
482
  "rightkit-qts": [
418
- "0.2.0"
483
+ "0.2.0",
484
+ "0.2.1",
485
+ "0.2.2",
486
+ "0.2.3"
419
487
  ],
420
488
  "rightkit-control": [
421
489
  "0.1.6",
422
490
  "0.1.7",
423
491
  "0.1.8"
492
+ ],
493
+ "rightkit-secrets": [
494
+ "0.1.0",
495
+ "0.1.1"
496
+ ],
497
+ "rightkit-http": [
498
+ "0.1.0",
499
+ "0.2.0",
500
+ "0.2.1"
501
+ ],
502
+ "rightkit-fs": [
503
+ "0.1.0",
504
+ "0.2.0",
505
+ "0.3.0",
506
+ "0.3.1"
507
+ ],
508
+ "rightkit-service": [
509
+ "0.1.0",
510
+ "0.1.1",
511
+ "0.1.2"
512
+ ],
513
+ "rightkit-search": [
514
+ "0.1.0"
515
+ ],
516
+ "rightkit-tauri": [
517
+ "0.1.1"
518
+ ],
519
+ "rightkit-qts-ggml": [
520
+ "0.1.0"
521
+ ],
522
+ "rightkit-pdf": [
523
+ "0.1.0"
524
+ ],
525
+ "rightkit-speech-client": [
526
+ "0.3.0",
527
+ "0.3.1"
528
+ ],
529
+ "rightkit-crash": [
530
+ "0.1.0"
531
+ ],
532
+ "rightkit-qts-ggml-sys": [
533
+ "0.1.0"
424
534
  ]
425
535
  }
426
536
  }
@@ -21,8 +21,8 @@ export const RIGHT_SUITE_APP_KEYS = Object.freeze([
21
21
  "voiceright",
22
22
  ]);
23
23
 
24
- const TARGET_OSES = new Set(["windows", "darwin", "linux", "ios"]);
25
- const TARGET_ARCHES = new Set(["x86_64", "aarch64", "universal"]);
24
+ const TARGET_OSES = new Set(["windows", "darwin", "linux", "ios", "any"]);
25
+ const TARGET_ARCHES = new Set(["x86_64", "aarch64", "universal", "any"]);
26
26
  const VERSION_FIELDS = Object.freeze([
27
27
  "runtime",
28
28
  "model",
@@ -32,6 +32,7 @@ const VERSION_FIELDS = Object.freeze([
32
32
  "provenance",
33
33
  ]);
34
34
  const SHA256 = /^[0-9a-f]{64}$/;
35
+ const ARTIFACT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
35
36
 
36
37
  export function buildRuntimeArtifactManifest(input) {
37
38
  const entitlement = cloneObject(input.entitlement);
@@ -53,6 +54,7 @@ export function buildRuntimeArtifactManifest(input) {
53
54
  provenance: cloneObject(input.provenance),
54
55
  promotion: cloneObject(input.promotion),
55
56
  };
57
+ if (Object.hasOwn(input, "artifactId")) manifest.artifactId = input.artifactId;
56
58
  if (manifest.distribution?.delivery === "bundled") {
57
59
  manifest.object.r2Key = null;
58
60
  manifest.pointerKey = null;
@@ -78,11 +80,15 @@ export function runtimeArtifactManifestPointerKey(value) {
78
80
  const kind = value?.artifactKind;
79
81
  const os = value?.target?.os;
80
82
  const arch = value?.target?.arch;
83
+ const hasArtifactId = value !== null && typeof value === "object" && Object.hasOwn(value, "artifactId");
81
84
  assertAppKey(appKey, "entitlement.appKey");
85
+ if (hasArtifactId) assertArtifactId(value.artifactId);
82
86
  if (!RUNTIME_ARTIFACT_KINDS.includes(kind)) fail("artifactKind is unsupported");
83
87
  if (!TARGET_OSES.has(os)) fail("target.os is unsupported");
84
88
  if (!TARGET_ARCHES.has(arch)) fail("target.arch is unsupported");
85
- return `${appKey}/runtime-artifacts/${kind}/${os}/${arch}/current/manifest.json`;
89
+ if ((os === "any") !== (arch === "any")) fail("target any must use any/any");
90
+ const artifactPath = hasArtifactId ? `${value.artifactId}/` : "";
91
+ return `${appKey}/runtime-artifacts/${kind}/${artifactPath}${os}/${arch}/current/manifest.json`;
86
92
  }
87
93
 
88
94
  export function validateRuntimeArtifactManifest(value) {
@@ -90,7 +96,8 @@ export function validateRuntimeArtifactManifest(value) {
90
96
  assertExactKeys(value, [
91
97
  "schema", "artifactKind", "entitlement", "distribution", "target", "object", "pointerKey",
92
98
  "versions", "provenance", "promotion",
93
- ], "manifest");
99
+ ], "manifest", ["artifactId"]);
100
+ if (Object.hasOwn(value, "artifactId")) assertArtifactId(value.artifactId);
94
101
  if (value.schema !== RUNTIME_ARTIFACT_SCHEMA) fail("schema must be 1");
95
102
  if (!RUNTIME_ARTIFACT_KINDS.includes(value.artifactKind)) fail("artifactKind is unsupported");
96
103
 
@@ -120,6 +127,7 @@ export function validateRuntimeArtifactManifest(value) {
120
127
  assertExactKeys(value.target, ["os", "arch"], "target");
121
128
  if (!TARGET_OSES.has(value.target.os)) fail("target.os is unsupported");
122
129
  if (!TARGET_ARCHES.has(value.target.arch)) fail("target.arch is unsupported");
130
+ if ((value.target.os === "any") !== (value.target.arch === "any")) fail("target any must use any/any");
123
131
 
124
132
  assertPlainObject(value.object, "object");
125
133
  assertExactKeys(value.object, ["r2Key", "filename", "sha256", "sizeBytes"], "object");
@@ -204,12 +212,18 @@ function sortDeep(value) {
204
212
  return value;
205
213
  }
206
214
 
207
- function assertExactKeys(value, expected, label) {
208
- const expectedSet = new Set(expected);
215
+ function assertExactKeys(value, expected, label, optional = []) {
216
+ const expectedSet = new Set([...expected, ...optional]);
209
217
  for (const key of Object.keys(value)) if (!expectedSet.has(key)) fail(`${label} has unknown field ${key}`);
210
218
  for (const key of expected) if (!Object.hasOwn(value, key)) fail(`${label}.${key} is required`);
211
219
  }
212
220
 
221
+ function assertArtifactId(value) {
222
+ if (typeof value !== "string" || value.length > 128 || value.trim() !== value || !ARTIFACT_ID.test(value)) {
223
+ fail("artifactId must be a lowercase safe slug (^[a-z0-9]+(?:-[a-z0-9]+)*$), max 128 characters");
224
+ }
225
+ }
226
+
213
227
  function assertPlainObject(value, label) {
214
228
  if (value === null || typeof value !== "object" || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype) fail(`${label} must be a plain object`);
215
229
  }
package/sign-updater.mjs CHANGED
@@ -3,6 +3,7 @@ import { spawnSync } from "./background-process.mjs";
3
3
  import { existsSync, readFileSync, rmSync } from "node:fs";
4
4
  import path from "node:path";
5
5
  import { signMacUpdaterFiles } from "./macos-signing-session.mjs";
6
+ import { refuseManagedEnvSecrets, MANAGED_HOST_ENV_SECRET_REFUSED } from "./managed-host-secrets.mjs";
6
7
 
7
8
  const args = process.argv.slice(2);
8
9
  const files = [];
@@ -15,6 +16,10 @@ for (let i = 0; i < args.length; i++) {
15
16
  if (!files.length) fail("at least one --file is required");
16
17
 
17
18
  const env = { ...process.env };
19
+ if (!dryRun) {
20
+ try { refuseManagedEnvSecrets(process.env, ["TAURI_SIGNING_PRIVATE_KEY", "TAURI_SIGNING_PRIVATE_KEY_PASSWORD"]); }
21
+ catch (error) { fail(`[${MANAGED_HOST_ENV_SECRET_REFUSED}] ${error.message}`); }
22
+ }
18
23
  if (!dryRun && !env.TAURI_SIGNING_PRIVATE_KEY) {
19
24
  if (process.platform === "win32") {
20
25
  const key = path.join(env.APPDATA || "", "ViewRight", "updater.key");
@@ -127,7 +127,8 @@ export function requestSigningAgentSync(request, { runClient = spawnSync, home,
127
127
  if (result.error || result.status !== 0) throw new SigningAgentError("MAC_SIGNING_AGENT_CONNECTION", "Signing agent client failed");
128
128
  return report;
129
129
  }
130
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
130
+ const realOrSelf = (file) => { try { return fs.realpathSync(file); } catch { return path.resolve(file); } };
131
+ if (process.argv[1] && realOrSelf(process.argv[1]) === realOrSelf(fileURLToPath(import.meta.url))) {
131
132
  try {
132
133
  const { request, home, timeoutMs } = JSON.parse(fs.readFileSync(0, "utf8"));
133
134
  const report = await requestSigningAgent(request, { paths: signingAgentPaths(home), timeoutMs,