3167e19b4f
## Summary Consolidates the fix and tests from #1285 and #1293 into a single PR. - **js-sdk**: `uploadFile` used to pass a Node `Readable` directly to `fetch`, causing undici to fall back to `Transfer-Encoding: chunked`. S3 presigned PUT URLs reject chunked with 501 NotImplemented. Fix buffers the archive first so `Content-Length` is set. Includes: - Regression test that spins up a local HTTP server and asserts `Content-Length` is set and matches the body, and `Transfer-Encoding` is not chunked. - Type-fix for the CLI's typecheck (cast `Pack` → `AsyncIterable<Buffer>`). - Dynamic import of `node:stream/consumers` so the browser bundle doesn't pull it in. - **python-sdk**: Adds sync + async regression tests for `upload_file` that guard against the same class of bug (someone swapping `tar_buffer.getvalue()` for a stream/generator). No Python code change — the current implementation already passes bytes to `httpx.put(..., content=...)`. Authorship of the original JS fix commit preserved (truffle-dev). Closes #1243. ## Test plan - [x] `pnpm run test tests/template/uploadFile.test.ts` — passes - [x] `pnpm run typecheck` / `lint` clean across js-sdk and cli - [x] `poetry run pytest tests/sync/template_sync/test_upload_file.py tests/async/template_async/test_upload_file.py -v` — both pass - [x] `poetry run make format` / `make lint` / `make typecheck` clean 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: truffle <truffleagent@gmail.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>