src/lib/chatAttachments.ts and the routes below.
An attachment records its identity, filename, MIME type, storage URI, lifecycle state, and ownership scope. A completed attachment is registered as an independent direct source and sealed into the job’s immutable source manifest only after its source-rights authorization passes
src/lib/sourceRights.ts.
Uploaded bytes belong in the configured asset store. The browser does not mint workflow authority, and a filename or MIME declaration is not proof of rights or content integrity.