feat(import): one native-client staging contract (client_item_id, /meta, canonical source)
Evolve the import staging API in place so web, `sol import`, and native
clients stage through one strengthened contract.
- /save + /save-path now REQUIRE client_item_id (idempotency key). Staged
scan gives idempotent replay (same id + same content) vs 409
import_client_id_conflict (same id, different content). Replay of an
already-started item recommends do_not_start.
- Duplicates are terminal: content matching an imported manifest OR an
already-staged item returns status=duplicate / recommended_action=
do_not_start and is NOT staged again. /start refuses a saved terminal
duplicate regardless of force.
- /save returns a versioned summary: schema_version, status, replay, path,
timestamp, client_item_id, source (server-inferred canonical
audio|image|document|text), facet, setting, recommended_action, a metadata
bag (incl. flexible client bag), diagnostics (folds timestamp_detection_*),
and a duplicate object when applicable. /save-path shares the shape.
- /api/facet renamed to /api/meta (clean break, no alias).
- /start is saved-metadata-authority (ignores request source/facet/setting)
and routes via saved source_hint. recording/quick/apple never reach the
wire or the importer as source values.
Conservative PDF: canonical source reports "document" for PDFs as metadata,
but generic/quick PDF processing is unchanged (still the text path).
Intentional BREAKING changes to import.save, re-pinned via `make openapi`:
required client_item_id; top-level timestamp_detection_* moved under
diagnostics. Adds import.savePath + import.meta ops. Native-client (iOS)
owners must update.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>