* refactor: replace hardcoded media type mappings with INBOUND_EXTENSION_MEDIA_TYPES
- Removed the _EXTENSION_MEDIA_TYPES dictionary from uploads.py and replaced it with INBOUND_EXTENSION_MEDIA_TYPES imported from inbound_store.py.
- Updated the _resolve_media_type and validate_inbound_media_type functions to utilize the new mapping for determining media types based on file extensions.
- Added unit tests to ensure that unknown MIME types correctly fall back to their respective extensions and that unsupported types raise appropriate errors.
* fix(api): improve error handling for upload requests
- Refactored error rejection in requestUpload to provide clearer error messages, including response text when available.
- Updated error handling in WorkspaceDrawer and useChatAttachments to utilize a new utility function for consistent API error messaging.
* feat: add error handling for unsupported and oversized attachments
- Introduced new error codes for unsupported file types and oversized attachments in the API.
- Updated localization files for English and Chinese to include messages for these new error codes.
- Enhanced the inbound media validation logic to raise appropriate errors when attachments exceed size limits or are of unsupported types.
- Added unit tests to verify the new error handling for attachment validation.
* feat: expand allowed inbound media types and improve validation logic
- Added a comprehensive list of allowed inbound media types and their corresponding file extensions to enhance file type validation.
- Introduced new test cases to ensure that various file extensions and MIME types are correctly validated, including support for additional programming and document formats.
- Updated the existing validation logic to accommodate new media types and ensure proper fallback mechanisms for unknown MIME types.
* feat: workspace backend sandboxing, execute-env injection, and ephemeral image refs
Workspace file-I/O hardening across backend and dashboard:
- Host directory sandboxing via root_dir allow-list and denied prefixes
- Execute-environment defaults injected into harness backend specs
- Ephemeral workspace image rematerialization for model calls
- Attachment hint expansion and inbound store improvements
- Portable memory backend and skill workspace catalog updates
- Dashboard UI for agent backend fields and root-dir selection
- Bump harness-agent 0.9.23 / harness-memory 0.9.7; docs + install notes
* feat: add user invitation codes with admin management and redeem flow
- Add user_invites table (migration 009) plus SQLite/Postgres reconcile paths
- Add InviteRepo and InviteService for create/revoke/list/redeem
- Expose public validate/redeem endpoints and admin create/revoke/list routers
- Extract default-agent bootstrap into octop.infra.agents.default_agent
- Add invite error codes and en/zh i18n strings
- Dashboard: invite drawer, login redeem UI, users list, and locales
* fix: add Windows cross-platform guards for pre-existing sandbox/rootfs tests
- Guard POSIX/container-only tests (rootfs-absolute /.octop/... workspace
paths) with posix_only in test_thread_artifacts.py and test_agent_manager.py
- Normalize the rendered workspace path assertion in test_octop_builtin_skills.py
(forward slashes on Windows, not str(tmp_path) backslashes)
- Canonicalize ws_dir before the prefix check in attachment hint/path tests
(tempfile may yield an 8.3 short path on Windows while the resolved
attachment path uses the long form)
These failures predate the user-invites commit and are unrelated to it; the
product path logic is correct.
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>