@indigoai-us/hq-cloud 6.11.11 → 6.11.13

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 (220) hide show
  1. package/dist/bin/sync-runner-company.d.ts +35 -0
  2. package/dist/bin/sync-runner-company.d.ts.map +1 -0
  3. package/dist/bin/sync-runner-company.js +290 -0
  4. package/dist/bin/sync-runner-company.js.map +1 -0
  5. package/dist/bin/sync-runner-events.d.ts +12 -0
  6. package/dist/bin/sync-runner-events.d.ts.map +1 -0
  7. package/dist/bin/sync-runner-events.js +12 -0
  8. package/dist/bin/sync-runner-events.js.map +1 -0
  9. package/dist/bin/sync-runner-planning.d.ts +53 -0
  10. package/dist/bin/sync-runner-planning.d.ts.map +1 -0
  11. package/dist/bin/sync-runner-planning.js +59 -0
  12. package/dist/bin/sync-runner-planning.js.map +1 -0
  13. package/dist/bin/sync-runner-rollup.d.ts +24 -0
  14. package/dist/bin/sync-runner-rollup.d.ts.map +1 -0
  15. package/dist/bin/sync-runner-rollup.js +46 -0
  16. package/dist/bin/sync-runner-rollup.js.map +1 -0
  17. package/dist/bin/sync-runner-telemetry.d.ts +5 -0
  18. package/dist/bin/sync-runner-telemetry.d.ts.map +1 -0
  19. package/dist/bin/sync-runner-telemetry.js +5 -0
  20. package/dist/bin/sync-runner-telemetry.js.map +1 -0
  21. package/dist/bin/sync-runner-watch-loop.d.ts +17 -0
  22. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -0
  23. package/dist/bin/sync-runner-watch-loop.js +372 -0
  24. package/dist/bin/sync-runner-watch-loop.js.map +1 -0
  25. package/dist/bin/sync-runner-watch-routes.d.ts +25 -0
  26. package/dist/bin/sync-runner-watch-routes.d.ts.map +1 -0
  27. package/dist/bin/sync-runner-watch-routes.js +74 -0
  28. package/dist/bin/sync-runner-watch-routes.js.map +1 -0
  29. package/dist/bin/sync-runner.d.ts +5 -54
  30. package/dist/bin/sync-runner.d.ts.map +1 -1
  31. package/dist/bin/sync-runner.js +76 -978
  32. package/dist/bin/sync-runner.js.map +1 -1
  33. package/dist/bin/sync-runner.test.js +265 -11
  34. package/dist/bin/sync-runner.test.js.map +1 -1
  35. package/dist/cli/reindex.d.ts.map +1 -1
  36. package/dist/cli/reindex.js +34 -17
  37. package/dist/cli/reindex.js.map +1 -1
  38. package/dist/cli/reindex.test.js +39 -5
  39. package/dist/cli/reindex.test.js.map +1 -1
  40. package/dist/cli/rescue-classify-ordering.test.js +75 -0
  41. package/dist/cli/rescue-classify-ordering.test.js.map +1 -1
  42. package/dist/cli/rescue-core.d.ts +45 -0
  43. package/dist/cli/rescue-core.d.ts.map +1 -1
  44. package/dist/cli/rescue-core.js +320 -170
  45. package/dist/cli/rescue-core.js.map +1 -1
  46. package/dist/cli/share.d.ts +2 -1
  47. package/dist/cli/share.d.ts.map +1 -1
  48. package/dist/cli/share.js +276 -660
  49. package/dist/cli/share.js.map +1 -1
  50. package/dist/cli/share.test.js +30 -0
  51. package/dist/cli/share.test.js.map +1 -1
  52. package/dist/cli/sync.d.ts +28 -1
  53. package/dist/cli/sync.d.ts.map +1 -1
  54. package/dist/cli/sync.js +541 -748
  55. package/dist/cli/sync.js.map +1 -1
  56. package/dist/cli/sync.test.js +382 -1
  57. package/dist/cli/sync.test.js.map +1 -1
  58. package/dist/cognito-auth.d.ts.map +1 -1
  59. package/dist/cognito-auth.js +55 -10
  60. package/dist/cognito-auth.js.map +1 -1
  61. package/dist/cognito-auth.test.js +61 -0
  62. package/dist/cognito-auth.test.js.map +1 -1
  63. package/dist/daemon-worker.d.ts +2 -2
  64. package/dist/daemon-worker.js +3 -3
  65. package/dist/daemon-worker.js.map +1 -1
  66. package/dist/index.d.ts +2 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/journal.d.ts.map +1 -1
  71. package/dist/journal.js +93 -6
  72. package/dist/journal.js.map +1 -1
  73. package/dist/journal.test.js +59 -0
  74. package/dist/journal.test.js.map +1 -1
  75. package/dist/machine-auth.test.js +60 -2
  76. package/dist/machine-auth.test.js.map +1 -1
  77. package/dist/object-io.d.ts +37 -1
  78. package/dist/object-io.d.ts.map +1 -1
  79. package/dist/object-io.js +149 -30
  80. package/dist/object-io.js.map +1 -1
  81. package/dist/object-io.test.js +121 -0
  82. package/dist/object-io.test.js.map +1 -1
  83. package/dist/operation-lock.d.ts +8 -8
  84. package/dist/operation-lock.d.ts.map +1 -1
  85. package/dist/operation-lock.js +99 -32
  86. package/dist/operation-lock.js.map +1 -1
  87. package/dist/operation-lock.test.js +51 -4
  88. package/dist/operation-lock.test.js.map +1 -1
  89. package/dist/personal-vault.d.ts.map +1 -1
  90. package/dist/personal-vault.js +8 -2
  91. package/dist/personal-vault.js.map +1 -1
  92. package/dist/personal-vault.test.js +34 -0
  93. package/dist/personal-vault.test.js.map +1 -1
  94. package/dist/prefix-coalesce.d.ts +20 -9
  95. package/dist/prefix-coalesce.d.ts.map +1 -1
  96. package/dist/prefix-coalesce.js +124 -28
  97. package/dist/prefix-coalesce.js.map +1 -1
  98. package/dist/prefix-coalesce.test.js +57 -2
  99. package/dist/prefix-coalesce.test.js.map +1 -1
  100. package/dist/remote-pull.d.ts +8 -3
  101. package/dist/remote-pull.d.ts.map +1 -1
  102. package/dist/remote-pull.js +85 -16
  103. package/dist/remote-pull.js.map +1 -1
  104. package/dist/remote-pull.test.js +213 -2
  105. package/dist/remote-pull.test.js.map +1 -1
  106. package/dist/s3.d.ts +2 -0
  107. package/dist/s3.d.ts.map +1 -1
  108. package/dist/s3.js +197 -116
  109. package/dist/s3.js.map +1 -1
  110. package/dist/s3.test.js +109 -0
  111. package/dist/s3.test.js.map +1 -1
  112. package/dist/scope-shrink.d.ts +3 -2
  113. package/dist/scope-shrink.d.ts.map +1 -1
  114. package/dist/scope-shrink.js +1 -1
  115. package/dist/scope-shrink.js.map +1 -1
  116. package/dist/skill-telemetry.d.ts +1 -1
  117. package/dist/skill-telemetry.d.ts.map +1 -1
  118. package/dist/skill-telemetry.js +69 -9
  119. package/dist/skill-telemetry.js.map +1 -1
  120. package/dist/skill-telemetry.test.js +86 -0
  121. package/dist/skill-telemetry.test.js.map +1 -1
  122. package/dist/sync/event-sync.d.ts +6 -0
  123. package/dist/sync/event-sync.d.ts.map +1 -1
  124. package/dist/sync/event-sync.js +34 -1
  125. package/dist/sync/event-sync.js.map +1 -1
  126. package/dist/sync/event-sync.test.js +73 -0
  127. package/dist/sync/event-sync.test.js.map +1 -1
  128. package/dist/sync/metrics.d.ts +17 -1
  129. package/dist/sync/metrics.d.ts.map +1 -1
  130. package/dist/sync/metrics.js +32 -1
  131. package/dist/sync/metrics.js.map +1 -1
  132. package/dist/sync/metrics.test.js +74 -1
  133. package/dist/sync/metrics.test.js.map +1 -1
  134. package/dist/sync/pull-scope.d.ts.map +1 -1
  135. package/dist/sync/pull-scope.js +15 -7
  136. package/dist/sync/pull-scope.js.map +1 -1
  137. package/dist/sync/push-receiver.d.ts +12 -5
  138. package/dist/sync/push-receiver.d.ts.map +1 -1
  139. package/dist/sync/push-receiver.js +45 -17
  140. package/dist/sync/push-receiver.js.map +1 -1
  141. package/dist/sync/push-receiver.test.js +67 -1
  142. package/dist/sync/push-receiver.test.js.map +1 -1
  143. package/dist/sync-core.d.ts +27 -0
  144. package/dist/sync-core.d.ts.map +1 -0
  145. package/dist/sync-core.js +54 -0
  146. package/dist/sync-core.js.map +1 -0
  147. package/dist/telemetry.d.ts +1 -1
  148. package/dist/telemetry.d.ts.map +1 -1
  149. package/dist/telemetry.js +59 -6
  150. package/dist/telemetry.js.map +1 -1
  151. package/dist/telemetry.test.js +74 -0
  152. package/dist/telemetry.test.js.map +1 -1
  153. package/dist/types.d.ts +8 -0
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/vault-client.d.ts.map +1 -1
  156. package/dist/vault-client.js +284 -36
  157. package/dist/vault-client.js.map +1 -1
  158. package/dist/vault-client.test.js +59 -0
  159. package/dist/vault-client.test.js.map +1 -1
  160. package/dist/watcher.d.ts +38 -20
  161. package/dist/watcher.d.ts.map +1 -1
  162. package/dist/watcher.js +155 -143
  163. package/dist/watcher.js.map +1 -1
  164. package/dist/watcher.test.js +103 -0
  165. package/dist/watcher.test.js.map +1 -1
  166. package/package.json +1 -1
  167. package/src/bin/sync-runner-company.ts +350 -0
  168. package/src/bin/sync-runner-events.ts +25 -0
  169. package/src/bin/sync-runner-planning.ts +121 -0
  170. package/src/bin/sync-runner-rollup.ts +72 -0
  171. package/src/bin/sync-runner-telemetry.ts +8 -0
  172. package/src/bin/sync-runner-watch-loop.ts +443 -0
  173. package/src/bin/sync-runner-watch-routes.ts +86 -0
  174. package/src/bin/sync-runner.test.ts +298 -11
  175. package/src/bin/sync-runner.ts +99 -1054
  176. package/src/cli/reindex.test.ts +41 -3
  177. package/src/cli/reindex.ts +35 -19
  178. package/src/cli/rescue-classify-ordering.test.ts +81 -0
  179. package/src/cli/rescue-core.ts +400 -165
  180. package/src/cli/share.test.ts +38 -0
  181. package/src/cli/share.ts +420 -693
  182. package/src/cli/sync.test.ts +460 -1
  183. package/src/cli/sync.ts +788 -825
  184. package/src/cognito-auth.test.ts +77 -0
  185. package/src/cognito-auth.ts +73 -11
  186. package/src/daemon-worker.ts +3 -3
  187. package/src/index.ts +8 -0
  188. package/src/journal.test.ts +72 -0
  189. package/src/journal.ts +95 -8
  190. package/src/machine-auth.test.ts +64 -2
  191. package/src/object-io.test.ts +142 -0
  192. package/src/object-io.ts +183 -31
  193. package/src/operation-lock.test.ts +63 -4
  194. package/src/operation-lock.ts +99 -31
  195. package/src/personal-vault.test.ts +42 -0
  196. package/src/personal-vault.ts +8 -2
  197. package/src/prefix-coalesce.test.ts +71 -1
  198. package/src/prefix-coalesce.ts +155 -30
  199. package/src/remote-pull.test.ts +235 -1
  200. package/src/remote-pull.ts +106 -18
  201. package/src/s3.test.ts +126 -0
  202. package/src/s3.ts +237 -122
  203. package/src/scope-shrink.ts +6 -3
  204. package/src/skill-telemetry.test.ts +109 -0
  205. package/src/skill-telemetry.ts +82 -14
  206. package/src/sync/event-sync.test.ts +75 -0
  207. package/src/sync/event-sync.ts +54 -1
  208. package/src/sync/metrics.test.ts +81 -0
  209. package/src/sync/metrics.ts +59 -4
  210. package/src/sync/pull-scope.ts +23 -7
  211. package/src/sync/push-receiver.test.ts +73 -1
  212. package/src/sync/push-receiver.ts +56 -20
  213. package/src/sync-core.ts +58 -0
  214. package/src/telemetry.test.ts +85 -0
  215. package/src/telemetry.ts +69 -6
  216. package/src/types.ts +8 -0
  217. package/src/vault-client.test.ts +74 -0
  218. package/src/vault-client.ts +395 -43
  219. package/src/watcher.test.ts +117 -0
  220. package/src/watcher.ts +215 -174
package/dist/s3.js CHANGED
@@ -7,7 +7,10 @@
7
7
  */
8
8
  import * as fs from "fs";
9
9
  import * as path from "path";
10
- import { resolveObjectIO } from "./object-io.js";
10
+ import * as crypto from "crypto";
11
+ import { Readable, Transform } from "stream";
12
+ import { pipeline } from "stream/promises";
13
+ import { resolveObjectIO, } from "./object-io.js";
11
14
  /**
12
15
  * S3 user metadata is ASCII-only (lowercased on read, capped at 2 KB total).
13
16
  * Values that fail the printable-ASCII test or would push the keys over the
@@ -114,6 +117,7 @@ export function decodeSymlinkMetadataValue(value) {
114
117
  * extension can encode additional fields if needed.
115
118
  */
116
119
  export const SYMLINK_BODY_PREFIX = "hq-symlink:";
120
+ const SYMLINK_BODY_PREFIX_BYTES = Buffer.from(SYMLINK_BODY_PREFIX, "utf-8");
117
121
  /**
118
122
  * S3 user-metadata key carrying the source-side file mode (permission bits
119
123
  * only — \`mode & 0o777\`) as an octal string ("755", "640", etc.). On
@@ -197,6 +201,93 @@ export const FILE_BTIME_META_KEY = "hq-btime";
197
201
  export function encodeSymlinkBody(target) {
198
202
  return Buffer.from(SYMLINK_BODY_PREFIX + target, "utf-8");
199
203
  }
204
+ function downloadTempPath(localPath) {
205
+ const dir = path.dirname(localPath);
206
+ const random = crypto.randomBytes(10).toString("hex");
207
+ return path.join(dir, `.hq-tmp-${random}`);
208
+ }
209
+ function removeTempPath(tempPath) {
210
+ try {
211
+ fs.unlinkSync(tempPath);
212
+ }
213
+ catch {
214
+ // Best-effort cleanup; do not mask the transfer/materialization error.
215
+ }
216
+ }
217
+ async function getObjectStream(io, key) {
218
+ if (io.getObjectStream)
219
+ return io.getObjectStream(key);
220
+ const res = await io.getObject(key);
221
+ return {
222
+ body: (async function* () {
223
+ yield res.body;
224
+ })(),
225
+ metadata: res.metadata,
226
+ };
227
+ }
228
+ function bufferFromChunk(chunk) {
229
+ if (Buffer.isBuffer(chunk))
230
+ return chunk;
231
+ return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
232
+ }
233
+ function leadingBytes(chunks, totalLength, length) {
234
+ const out = Buffer.alloc(Math.min(totalLength, length));
235
+ let offset = 0;
236
+ for (const chunk of chunks) {
237
+ if (offset >= out.length)
238
+ break;
239
+ const take = Math.min(chunk.length, out.length - offset);
240
+ chunk.copy(out, offset, 0, take);
241
+ offset += take;
242
+ }
243
+ return out;
244
+ }
245
+ async function collectRemainingChunks(initialChunks, iterator) {
246
+ const chunks = [...initialChunks];
247
+ let totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
248
+ while (true) {
249
+ const next = await iterator.next();
250
+ if (next.done)
251
+ break;
252
+ const chunk = bufferFromChunk(next.value);
253
+ if (chunk.length === 0)
254
+ continue;
255
+ chunks.push(chunk);
256
+ totalLength += chunk.length;
257
+ }
258
+ return Buffer.concat(chunks, totalLength);
259
+ }
260
+ async function* regularDownloadChunks(initialChunks, iterator) {
261
+ for (const chunk of initialChunks) {
262
+ if (chunk.length > 0)
263
+ yield chunk;
264
+ }
265
+ while (true) {
266
+ const next = await iterator.next();
267
+ if (next.done)
268
+ break;
269
+ const chunk = bufferFromChunk(next.value);
270
+ if (chunk.length > 0)
271
+ yield chunk;
272
+ }
273
+ }
274
+ class HashingTransform extends Transform {
275
+ hash = crypto.createHash("sha256");
276
+ size = 0;
277
+ _transform(chunk, _encoding, callback) {
278
+ this.hash.update(chunk);
279
+ this.size += chunk.length;
280
+ callback(null, chunk);
281
+ }
282
+ digest() {
283
+ return this.hash.digest("hex");
284
+ }
285
+ }
286
+ async function streamRegularFileToTemp(tempPath, initialChunks, iterator) {
287
+ const hashing = new HashingTransform();
288
+ await pipeline(Readable.from(regularDownloadChunks(initialChunks, iterator)), hashing, fs.createWriteStream(tempPath, { flags: "wx" }));
289
+ return { hash: hashing.digest(), size: hashing.size };
290
+ }
200
291
  /**
201
292
  * Batch pre-mint transport URLs for `keys` under `op` so the subsequent
202
293
  * per-file transfer calls (downloadFile/headRemoteFile/…) reuse them instead
@@ -465,12 +556,20 @@ export async function uploadSymlink(ctx, target, key, author, precondition) {
465
556
  */
466
557
  export async function downloadFile(ctx, key, localPath) {
467
558
  const io = resolveObjectIO(ctx);
468
- // The transport returns the full object body buffered + its user metadata.
469
- // downloadFile already buffered the whole object (writeFileSync of the
470
- // concatenated chunks), so buffering at the transport layer is behavior-
471
- // preserving symlink record bodies are tiny and regular files were read
472
- // fully into memory regardless.
473
- const { body: objectBody, metadata } = await io.getObject(key);
559
+ const { body, metadata } = await getObjectStream(io, key);
560
+ const iterator = body[Symbol.asyncIterator]();
561
+ const initialChunks = [];
562
+ let initialLength = 0;
563
+ while (initialLength < SYMLINK_BODY_PREFIX_BYTES.length) {
564
+ const next = await iterator.next();
565
+ if (next.done)
566
+ break;
567
+ const chunk = bufferFromChunk(next.value);
568
+ if (chunk.length === 0)
569
+ continue;
570
+ initialChunks.push(chunk);
571
+ initialLength += chunk.length;
572
+ }
474
573
  const dir = path.dirname(localPath);
475
574
  if (!fs.existsSync(dir)) {
476
575
  fs.mkdirSync(dir, { recursive: true });
@@ -494,17 +593,20 @@ export async function downloadFile(ctx, key, localPath) {
494
593
  // The body is already buffered (tiny for symlink records); reading it here
495
594
  // is behavior-preserving for regular files (whose body never starts with
496
595
  // the prefix per the SYMLINK_BODY_PREFIX doc). See SYMLINK_BODY_PREFIX.
497
- const bodyString = objectBody.toString("utf-8");
596
+ const leading = leadingBytes(initialChunks, initialLength, SYMLINK_BODY_PREFIX_BYTES.length);
597
+ const bodyHasSymlinkPrefix = leading.length >= SYMLINK_BODY_PREFIX_BYTES.length &&
598
+ leading.subarray(0, SYMLINK_BODY_PREFIX_BYTES.length).equals(SYMLINK_BODY_PREFIX_BYTES);
498
599
  const isSymlinkRecord = (typeof symlinkMarker === "string" && symlinkMarker.length > 0) ||
499
- bodyString.startsWith(SYMLINK_BODY_PREFIX);
600
+ bodyHasSymlinkPrefix;
500
601
  if (isSymlinkRecord) {
602
+ const objectBody = await collectRemainingChunks(initialChunks, iterator);
501
603
  // The target lives in the body (marker-only metadata convention).
502
604
  // Symlink record bodies are bounded by target length (typically
503
605
  // <300 bytes for relative paths, hard-capped by S3's 5 GB object
504
- // size); the transport already buffered it.
606
+ // size); only this branch buffers the body so regular files can stream.
505
607
  let symlinkTarget;
506
- if (bodyString.startsWith(SYMLINK_BODY_PREFIX)) {
507
- symlinkTarget = bodyString.slice(SYMLINK_BODY_PREFIX.length);
608
+ if (bodyHasSymlinkPrefix) {
609
+ symlinkTarget = objectBody.toString("utf-8", SYMLINK_BODY_PREFIX_BYTES.length);
508
610
  }
509
611
  else {
510
612
  // Backward-compat fallback: a legacy upload from earlier in
@@ -519,127 +621,106 @@ export async function downloadFile(ctx, key, localPath) {
519
621
  symlinkTarget = decodeSymlinkMetadataValue(symlinkMarker ?? "");
520
622
  }
521
623
  if (symlinkTarget.length === 0) {
522
- throw new Error(`Symlink record for ${key} had no target (body: ${bodyString.length} bytes, marker: ${symlinkMarker})`);
624
+ throw new Error(`Symlink record for ${key} had no target (body: ${objectBody.length} bytes, marker: ${symlinkMarker})`);
523
625
  }
524
- // Replace whatever's at localPath. unlink covers regular files; for
525
- // a stale symlink this also frees the slot. ENOENT is fine — first
526
- // download of this key has nothing to clear. Other errors propagate
527
- // because they signal a real problem (permissions, parent missing).
626
+ const tempPath = downloadTempPath(localPath);
528
627
  try {
529
- fs.unlinkSync(localPath);
628
+ fs.symlinkSync(symlinkTarget, tempPath);
629
+ fs.renameSync(tempPath, localPath);
530
630
  }
531
631
  catch (err) {
532
- if (!err ||
533
- typeof err !== "object" ||
534
- !("code" in err) ||
535
- err.code !== "ENOENT") {
536
- throw err;
537
- }
632
+ removeTempPath(tempPath);
633
+ throw err;
538
634
  }
539
- fs.symlinkSync(symlinkTarget, localPath);
540
635
  return { metadata };
541
636
  }
542
- // Symmetric to the symlink branch above: when a key was previously a
543
- // symlink and is later replaced in S3 by a regular object, the local
544
- // path still holds the stale symlink from the last sync. Without this
545
- // unlink, fs.writeFileSync follows the link and overwrites its
546
- // target file's contents — leaving the link in place and the new
547
- // regular object never materializing at the intended path. lstat
548
- // (not statSync) avoids following the link to test what's there.
637
+ const tempPath = downloadTempPath(localPath);
638
+ let tempReady = true;
639
+ let streamed;
549
640
  try {
550
- const existing = fs.lstatSync(localPath);
551
- if (existing.isSymbolicLink()) {
552
- fs.unlinkSync(localPath);
553
- }
554
- }
555
- catch (err) {
556
- // ENOENT means nothing's there; let writeFileSync handle creation.
557
- if (err &&
558
- typeof err === "object" &&
559
- "code" in err &&
560
- err.code !== "ENOENT") {
561
- throw err;
562
- }
563
- }
564
- fs.writeFileSync(localPath, objectBody);
565
- // Bug #5 apply source-side mode after the byte write. See
566
- // FILE_MODE_META_KEY for the metadata contract. Parses defensively:
567
- // a malformed value falls through with no chmod so the umask default
568
- // applies, matching the legacy back-compat path. fs.chmodSync
569
- // follows symlinks — that's fine here because we're on the regular-
570
- // file branch (the symlink branch above already returned).
571
- //
572
- // Codex P2 (PR #24 round 3): strict octal-only regex BEFORE parseInt.
573
- // parseInt(modeOctal, 8) accepts partial-prefix garbage "755junk"
574
- // parses to 0o755 instead of NaN so tampered or malformed metadata
575
- // could still change local permissions unexpectedly. The regex
576
- // requires 1–4 pure octal digits (`[0-7]{1,4}$`), which matches what
577
- // the upload side stamps (`(mode & 0o777).toString(8)` → at most
578
- // three digits, all 0–7) and rejects everything else.
579
- const modeOctal = metadata?.[FILE_MODE_META_KEY];
580
- if (typeof modeOctal === "string" && /^[0-7]{1,4}$/.test(modeOctal)) {
581
- const parsed = parseInt(modeOctal, 8);
582
- if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 0o777) {
583
- try {
584
- fs.chmodSync(localPath, parsed);
585
- }
586
- catch {
587
- // chmod failure (read-only FS, EPERM) is non-fatal — the file
588
- // is materialized, just with the umask default. Surface via
589
- // S3-side metadata being present but the file not matching;
590
- // a future operator-side audit can reconcile.
641
+ streamed = await streamRegularFileToTemp(tempPath, initialChunks, iterator);
642
+ // Bug #5 — apply source-side mode after the byte write. See
643
+ // FILE_MODE_META_KEY for the metadata contract. Parses defensively:
644
+ // a malformed value falls through with no chmod so the umask default
645
+ // applies, matching the legacy back-compat path. The staged path is a
646
+ // regular file, then it is atomically renamed over the destination.
647
+ //
648
+ // Codex P2 (PR #24 round 3): strict octal-only regex BEFORE parseInt.
649
+ // parseInt(modeOctal, 8) accepts partial-prefix garbage — "755junk"
650
+ // parses to 0o755 instead of NaN — so tampered or malformed metadata
651
+ // could still change local permissions unexpectedly. The regex
652
+ // requires 1–4 pure octal digits (`[0-7]{1,4}$`), which matches what
653
+ // the upload side stamps (`(mode & 0o777).toString(8)` → at most
654
+ // three digits, all 0–7) and rejects everything else.
655
+ const modeOctal = metadata?.[FILE_MODE_META_KEY];
656
+ if (typeof modeOctal === "string" && /^[0-7]{1,4}$/.test(modeOctal)) {
657
+ const parsed = parseInt(modeOctal, 8);
658
+ if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 0o777) {
659
+ try {
660
+ fs.chmodSync(tempPath, parsed);
661
+ }
662
+ catch {
663
+ // chmod failure (read-only FS, EPERM) is non-fatal the file
664
+ // is materialized, just with the umask default. Surface via
665
+ // S3-side metadata being present but the file not matching;
666
+ // a future operator-side audit can reconcile.
667
+ }
591
668
  }
592
669
  }
593
- }
594
- // 5.37.0 apply source-side mtime after the byte write (and after the
595
- // chmod above; ordering between chmod and utimes doesn't matter, but
596
- // both must run AFTER writeFileSync because writeFileSync resets mtime
597
- // to wall-clock-now). See FILE_MTIME_META_KEY for the metadata contract.
598
- //
599
- // Strict-numeric regex BEFORE parseInt same Codex P2 lesson as hq-mode.
600
- // `^-?[0-9]{1,16}$` rejects partial-prefix garbage ("175junk" 175),
601
- // empty, double-signed, decimals, whitespace, and oversized strings. A
602
- // single optional leading `-` is allowed so pre-epoch / reproducible-build
603
- // timestamps round-trip (Codex PR #27 P2 `mtimeMs === 0` and negative
604
- // epoch values are legitimate). 16 digits comfortably covers any plausible
605
- // epoch-ms value (year ~5138 is 16 digits; we'll cross that bridge later).
606
- //
607
- // fs.utimesSync FOLLOWS symlinks — that's fine here because we're on
608
- // the regular-file branch (the symlink branch above already returned
609
- // before we reach this code).
610
- //
611
- // Composition with the 5.36.0 lstat fast-path: the journal stamp at the
612
- // share/sync call sites runs AFTER downloadFile returns, so the lstat
613
- // it captures sees the post-utimes mtime. Verified in cli/sync.ts
614
- // (downloadFile lstatSync updateEntry) and cli/share.ts (pull path
615
- // similarly lstats after downloadFile). If a future caller stamps the
616
- // journal BEFORE downloadFile completes, the fast-path will stale and
617
- // re-hash every sync forever — keep the call-site invariant intact.
618
- const mtimeRaw = metadata?.[FILE_MTIME_META_KEY];
619
- if (typeof mtimeRaw === "string" && /^-?[0-9]{1,16}$/.test(mtimeRaw)) {
620
- const mtimeMs = parseInt(mtimeRaw, 10);
621
- if (Number.isFinite(mtimeMs)) {
622
- try {
623
- // utimesSync accepts seconds OR Date; use Date(ms) for precision.
624
- // atime = mtime is fine — many filesystems are mounted noatime
625
- // and distinguishing "access" vs "modification" time doesn't
626
- // matter for sync semantics. Setting both keeps the on-disk
627
- // state deterministic across receivers.
628
- const mtimeDate = new Date(mtimeMs);
629
- fs.utimesSync(localPath, mtimeDate, mtimeDate);
630
- }
631
- catch {
632
- // EPERM / read-only FS / file just unlinked → non-fatal. The
633
- // file is materialized at write-time mtime; the source-of-truth
634
- // can re-sync next pass.
670
+ // 5.37.0 — apply source-side mtime after the byte write (and after the
671
+ // chmod above; ordering between chmod and utimes doesn't matter, but
672
+ // both must run AFTER writeFileSync because writeFileSync resets mtime
673
+ // to wall-clock-now). See FILE_MTIME_META_KEY for the metadata contract.
674
+ //
675
+ // Strict-numeric regex BEFORE parseInt — same Codex P2 lesson as hq-mode.
676
+ // `^-?[0-9]{1,16}$` rejects partial-prefix garbage ("175junk" 175),
677
+ // empty, double-signed, decimals, whitespace, and oversized strings. A
678
+ // single optional leading `-` is allowed so pre-epoch / reproducible-build
679
+ // timestamps round-trip (Codex PR #27 P2 `mtimeMs === 0` and negative
680
+ // epoch values are legitimate). 16 digits comfortably covers any plausible
681
+ // epoch-ms value (year ~5138 is 16 digits; we'll cross that bridge later).
682
+ //
683
+ // The staged file is regular; rename preserves these stamps at localPath.
684
+ //
685
+ // Composition with the 5.36.0 lstat fast-path: the journal stamp at the
686
+ // share/sync call sites runs AFTER downloadFile returns, so the lstat
687
+ // it captures sees the post-utimes mtime. Verified in cli/sync.ts
688
+ // (downloadFile lstatSync updateEntry) and cli/share.ts (pull path
689
+ // similarly lstats after downloadFile). If a future caller stamps the
690
+ // journal BEFORE downloadFile completes, the fast-path will stale and
691
+ // re-hash every sync forever keep the call-site invariant intact.
692
+ const mtimeRaw = metadata?.[FILE_MTIME_META_KEY];
693
+ if (typeof mtimeRaw === "string" && /^-?[0-9]{1,16}$/.test(mtimeRaw)) {
694
+ const mtimeMs = parseInt(mtimeRaw, 10);
695
+ if (Number.isFinite(mtimeMs)) {
696
+ try {
697
+ // utimesSync accepts seconds OR Date; use Date(ms) for precision.
698
+ // atime = mtime is fine — many filesystems are mounted noatime
699
+ // and distinguishing "access" vs "modification" time doesn't
700
+ // matter for sync semantics. Setting both keeps the on-disk
701
+ // state deterministic across receivers.
702
+ const mtimeDate = new Date(mtimeMs);
703
+ fs.utimesSync(tempPath, mtimeDate, mtimeDate);
704
+ }
705
+ catch {
706
+ // EPERM / read-only FS / file just unlinked → non-fatal. The
707
+ // file is materialized at write-time mtime; the source-of-truth
708
+ // can re-sync next pass.
709
+ }
635
710
  }
636
711
  }
712
+ fs.renameSync(tempPath, localPath);
713
+ tempReady = false;
714
+ }
715
+ finally {
716
+ if (tempReady)
717
+ removeTempPath(tempPath);
637
718
  }
638
719
  // TODO: stamp hq-btime once Node lands lbirthtime (or birthtimeSync).
639
720
  // The push side already emits hq-btime when the source FS tracks a
640
721
  // distinct creation time, so a future receiver upgrade picks it up
641
722
  // automatically without a server-side data migration.
642
- return { metadata };
723
+ return { metadata, contentHash: streamed.hash, contentSize: streamed.size };
643
724
  }
644
725
  export async function listRemoteFiles(ctx, prefix) {
645
726
  const io = resolveObjectIO(ctx);
package/dist/s3.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s3.js","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":"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"}
package/dist/s3.test.js CHANGED
@@ -9,6 +9,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
9
9
  import * as fs from "fs";
10
10
  import * as os from "os";
11
11
  import * as path from "path";
12
+ import * as crypto from "crypto";
12
13
  // Capture every command sent to the S3Client across the test suite. Cleared
13
14
  // in beforeEach so per-test assertions don't leak from neighbours.
14
15
  const sentCommands = [];
@@ -759,6 +760,114 @@ describe("downloadFile", () => {
759
760
  expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(true);
760
761
  expect(fs.readlinkSync(localPath)).toBe("fresh-target.md");
761
762
  });
763
+ it("F11: failed symlink downloads preserve the previous local file", async () => {
764
+ const localPath = path.join(tmpRoot, "preserve-on-failure.md");
765
+ fs.writeFileSync(localPath, "existing local copy");
766
+ nextGetObjectResponse = {
767
+ Body: (async function* () {
768
+ yield new TextEncoder().encode(SYMLINK_BODY_PREFIX + "x".repeat(10_000));
769
+ })(),
770
+ Metadata: { "hq-symlink-target": SYMLINK_MARKER_META_VALUE },
771
+ };
772
+ await expect(downloadFile(makeCtx(), "preserve-on-failure.md", localPath)).rejects.toThrow();
773
+ expect(fs.existsSync(localPath)).toBe(true);
774
+ expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(false);
775
+ expect(fs.readFileSync(localPath, "utf-8")).toBe("existing local copy");
776
+ });
777
+ it("R-F11: downloads to a near component-limit basename via a bounded temp name", async () => {
778
+ nextGetObjectResponse = {
779
+ Body: (async function* () {
780
+ yield Buffer.from("near-limit bytes");
781
+ })(),
782
+ Metadata: {},
783
+ };
784
+ const localPath = path.join(tmpRoot, "x".repeat(240));
785
+ await downloadFile(makeCtx(), "near-limit.bin", localPath);
786
+ expect(fs.readFileSync(localPath, "utf-8")).toBe("near-limit bytes");
787
+ });
788
+ it("F20: regular downloads do not decode the full body as UTF-8", async () => {
789
+ const body = Buffer.alloc(64 * 1024, 0x61);
790
+ const originalToString = body.toString;
791
+ body.toString = ((encoding, start, end) => {
792
+ const sliceStart = start ?? 0;
793
+ const sliceEnd = end ?? body.length;
794
+ if (sliceEnd - sliceStart > SYMLINK_BODY_PREFIX.length) {
795
+ throw new Error("full-body UTF-8 decode attempted");
796
+ }
797
+ return originalToString.call(body, encoding, start, end);
798
+ });
799
+ const io = {
800
+ putObject: async () => ({ etag: '"unused"' }),
801
+ getObject: async () => ({ body, metadata: {} }),
802
+ listObjects: async () => ({ objects: [] }),
803
+ deleteObject: async () => undefined,
804
+ headObject: async () => null,
805
+ };
806
+ const localPath = path.join(tmpRoot, "large-regular.bin");
807
+ setObjectIOFactory(() => io);
808
+ try {
809
+ await downloadFile(makeCtx(), "large-regular.bin", localPath);
810
+ }
811
+ finally {
812
+ setObjectIOFactory(null);
813
+ }
814
+ const written = fs.readFileSync(localPath);
815
+ expect(written.length).toBe(body.length);
816
+ expect(written[0]).toBe(0x61);
817
+ expect(written[written.length - 1]).toBe(0x61);
818
+ });
819
+ it("R-F20: streams regular downloads with hash metadata and still detects symlink records", async () => {
820
+ const regularChunks = [
821
+ Buffer.from("alpha-"),
822
+ Buffer.from("beta-"),
823
+ Buffer.from("gamma"),
824
+ ];
825
+ const regularBody = Buffer.concat(regularChunks);
826
+ const linkTarget = "../target.md";
827
+ const io = {
828
+ putObject: async () => ({ etag: '"unused"' }),
829
+ getObject: async () => {
830
+ throw new Error("buffered getObject attempted");
831
+ },
832
+ getObjectStream: async (key) => {
833
+ if (key === "streamed-link") {
834
+ return {
835
+ body: (async function* () {
836
+ yield Buffer.from("hq-");
837
+ yield Buffer.from("symlink:");
838
+ yield Buffer.from(linkTarget);
839
+ })(),
840
+ metadata: {},
841
+ };
842
+ }
843
+ return {
844
+ body: (async function* () {
845
+ for (const chunk of regularChunks)
846
+ yield chunk;
847
+ })(),
848
+ metadata: {},
849
+ };
850
+ },
851
+ listObjects: async () => ({ objects: [] }),
852
+ deleteObject: async () => undefined,
853
+ headObject: async () => null,
854
+ };
855
+ setObjectIOFactory(() => io);
856
+ try {
857
+ const localPath = path.join(tmpRoot, "streamed.bin");
858
+ const result = await downloadFile(makeCtx(), "streamed.bin", localPath);
859
+ expect(fs.readFileSync(localPath)).toEqual(regularBody);
860
+ expect(result.contentHash).toBe(crypto.createHash("sha256").update(regularBody).digest("hex"));
861
+ expect(result.contentSize).toBe(regularBody.length);
862
+ const linkPath = path.join(tmpRoot, "streamed-link");
863
+ await downloadFile(makeCtx(), "streamed-link", linkPath);
864
+ expect(fs.lstatSync(linkPath).isSymbolicLink()).toBe(true);
865
+ expect(fs.readlinkSync(linkPath)).toBe(linkTarget);
866
+ }
867
+ finally {
868
+ setObjectIOFactory(null);
869
+ }
870
+ });
762
871
  it("applies hq-mode metadata via chmod after byte write (Bug #5 — preserve permissions)", async () => {
763
872
  // Round-trip pair to the s3.upload test: source-side mode lives in
764
873
  // \`Metadata['hq-mode']\` as an octal string; the receiver must chmod