https://sonarly.com/issue/19030?type=bug
Creating a draft from a workflow version fails when a CODE step references a logic function whose built file (.mjs) doesn't exist in S3, because `duplicateOneWithSource` unconditionally tries to copy both source and built files without checking `isBuildUpToDate`.
Fix: **What changed:**
1. **`logic-function-from-source.service.ts`**: In `duplicateOneWithSource()`, replaced the single `copyResources()` call with two separate calls: `copySourceResources()` (always) and `copyBuiltResources()` (only when `existingLogicFunction.isBuildUpToDate` is true). This mirrors the guard pattern already used in `executeOneFromSource()` at line 362.
2. **`logic-function-resource.service.ts`**: Added two new methods `copySourceResources()` and `copyBuiltResources()` that handle source and built file copying independently, with their own typed parameter interfaces. The existing `copyResources()` method is preserved (though no longer called) to avoid breaking any future code that might reference it.
**Why this works:** When a logic function is created with custom source code (via `input.source`), only the source file is uploaded — no built `.mjs` file is created until `buildOneFromSource` is explicitly called. The `isBuildUpToDate` flag accurately tracks whether the built file exists. The duplicate inherits this flag (line 175), so the duplicated logic function correctly reflects that it also needs building.
**Monitoring improvement:** The fix itself eliminates the Sentry noise — by not attempting to copy non-existent built files, the S3 "No objects found" error no longer fires. No separate monitoring changes needed.