2.5 KiB
Pasted-text source capture
Observable behavior
source_capture_text accepts an authenticated principal, an authorized project, a stable capture ID and source key, and UTF-8 plain text or Markdown up to 1 MB. It rejects empty text, NUL bytes, malformed capture IDs, oversized metadata, unauthorized projects and requests above the byte limit. An optional original URL is normalized and stripped of credentials, query and fragment data.
The service stores the body in its private content-addressed artifact store, extracts it against the exact generated source revision, and returns a SourceRevisionRecord candidate marked capture_method=pasted-text. The operation does not register the source; the agent submits the returned candidate through the normal typed proposal workflow.
Capture metadata is checkpointed in a private disk journal keyed by authenticated principal and capture ID. The journal binds the project and a digest of all capture inputs, stores no source body, returns the original candidate on exact retry, and rejects reuse with changed inputs or a different project. The journal retains at most 1,024 receipts. Source records also identify url-fetch and local-file capture methods; records created before this field existed load as unspecified.
Verification
tests/api/test_mcp_contribution.pyexercises the live Streamable HTTP MCP path, including editor success, viewer and cross-project denial, exact retry, changed-input conflict, URL credential redaction, body digest, stored extraction and citation text, invalid metadata/control characters and the 1 MB limit.tests/application/test_uploads.pyrecreates the artifact-store adapter and verifies receipt recovery, principal isolation and conflict behavior across restart.tests/api/test_stdio_connector.pyconfirms local-file candidates identify their capture method; the URL fixture confirmsurl-fetchprovenance.- Generated JSON schemas, catalog, HTTP OpenAPI, TypeScript types and the GEWU 0.10.0 MCP contract snapshot regenerate and verify.
- Full local verification: 156 backend tests, Ruff, mypy (36 source files), import boundaries, 13 frontend tests, production build and both Chromium tests pass.
Remaining qualification
This closes a synthetic local pasted-text path only. Supplied NotebookLM exports, native-host workflows, Windows/macOS parser support, representative real sources, and real-source citation accuracy remain open under M2.3 and M3.4. The receipt journal is bounded; retries after receipt eviction can create a fresh candidate.