Skip to content

Release v0.6.0 - #187

Open
glennbolton wants to merge 14 commits into
mainfrom
release/v0.6.0
Open

Release v0.6.0#187
glennbolton wants to merge 14 commits into
mainfrom
release/v0.6.0

Conversation

@glennbolton

Copy link
Copy Markdown
Contributor

Release summary

This PR promotes Intercept v0.6.0 to main. It fixes attachment description persistence and protects attachment download metadata during edits, while adding a single-origin nginx development harness for local and tunneled environments.

Highlights

Attachment metadata and downloads

  • Attachment descriptions, timestamps, and tags are now included in presigned-upload requests and persisted when the timeline item is created.
  • Metadata-only attachment edits preserve server-owned storage keys, hashes, uploader identity, file metadata, and upload status.
  • Editing an attachment description no longer breaks subsequent download URL generation.
  • Completing an upload now explicitly clears its temporary upload-storage key without allowing merge behavior to restore it.
  • Client upload handling forwards the attachment metadata consistently and generated API types reflect the expanded request model.

Single-origin development harness

  • A local nginx service exposes the frontend, API, WebSockets, and object storage through one loopback port, defaulting to 127.0.0.1:8080.
  • Internal services use Compose DNS and remain unexposed except for loopback PostgreSQL access used by tests and migrations.
  • Presigned MinIO URLs are rewritten through /storage/ while preserving the host information required for signature validation.
  • CORS, OIDC redirect origins, secure session cookies, and Vite host validation can use a configured HTTPS public origin such as a Cloudflare Tunnel hostname.
  • The frontend API client defaults to the browser origin, and Vite proxies API and WebSocket traffic to the backend during development.

Upgrade notes

  • No database migration is required.
  • The application version is bumped from 0.5.1 to 0.6.0.
  • The nginx harness is development-only and is documented in docs/local-nginx-harness.md.
  • Existing production deployment behavior is unchanged.

Verification

  • Attachment integration suites: 10 passed.
  • Frontend tests passed; focused upload and WebSocket tests passed.
  • Frontend lint and TypeScript configuration checks passed.
  • Podman Compose stack started successfully with PostgreSQL, MinIO, worker, backend, frontend, Langflow, and nginx running.
  • Frontend, tunneled Host-header routing, and MinIO storage proxy returned HTTP 200 through nginx.

Comment thread backend/app/services/mcp_oauth_service.py Fixed
Comment thread backend/app/services/mcp_oauth_service.py Fixed
Comment thread backend/app/services/mcp_oauth_service.py Fixed
Comment thread backend/app/services/mcp_oauth_service.py Fixed
Comment thread backend/app/api/routes/mcp_oauth.py Fixed
Comment thread backend/db_migrations/versions/013_mcp_oauth.py Fixed
Comment thread backend/db_migrations/versions/013_mcp_oauth.py Fixed
Comment thread backend/db_migrations/versions/013_mcp_oauth.py Fixed
Comment thread backend/db_migrations/versions/013_mcp_oauth.py Fixed
Comment thread backend/app/services/mcp_oauth_service.py Fixed
class PendingAuthorizationStore(Protocol):
"""Persistence seam used by the consent route and OAuth provider."""

async def create(self, pending: PendingAuthorization) -> None: ...

async def create(self, pending: PendingAuthorization) -> None: ...

async def get(self, request_id: UUID) -> PendingAuthorization | None: ...

async def get(self, request_id: UUID) -> PendingAuthorization | None: ...

async def consume(self, request_id: UUID) -> PendingAuthorization | None: ...
user: UserAccount,
*,
context: AuditContext | None = None,
) -> str: ...
context: AuditContext | None = None,
) -> str: ...

async def get_client(self, client_id: str) -> OAuthClientInformationFull | None: ...

async def get_client(self, client_id: str) -> OAuthClientInformationFull | None: ...

async def register_client(self, client_info: OAuthClientInformationFull) -> None: ...
glennbolton and others added 3 commits July 19, 2026 20:53
Upgrade @tidemark-security/ux to v0.4.0 and replace local toolbar and assignee implementations with package exports.

Use the shared assignee and date-range controls in entity filters, including current-user selection coverage.
Bind the Langflow development service to 127.0.0.1:7860 so its UI and API are reachable from the host without exposing them beyond localhost.

def hash_opaque_token(token: str) -> str:
"""Return the canonical non-reversible digest for opaque credentials."""
return hashlib.blake2b(token.encode("utf-8"), digest_size=32).hexdigest()
heartbeat_task.cancel()
try:
await heartbeat_task
except asyncio.CancelledError:
self,
client: OAuthClientInformationFull,
authorization_code: str,
) -> AuthorizationCode | None: ...
self,
client: OAuthClientInformationFull,
authorization_code: AuthorizationCode,
) -> OAuthToken: ...
self,
client: OAuthClientInformationFull,
refresh_token: str,
) -> RefreshToken | None: ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants