Tale v0.2.93
Highlights
Attach images and documents to tasks
Tasks can now carry attachments. Attach images and documents (PDF / Office / CSV / text — no audio or video) when creating a task, and add or remove them from a task's detail view. Up to 10 files per task, validated against an images/documents MIME allow-list, with each storage id verified to belong to your org. Removing an attachment or deleting a task purges the underlying blob. The attachment array is self-described on the task row, so the board and detail views render without an extra join. (#2168)
One-click prompt library
With an empty composer there is nothing to save as a draft, so the bookmark button's dropdown only ever offered "Prompt library". The bookmark now opens the Prompt library dialog directly when the composer is empty — one click instead of two. When the composer has text it is unchanged: the dropdown still offers Save prompt draft plus Prompt library. (#2166)
Fixes
- Chat — org isolation on switch: Switching organizations with a chat thread open kept rendering the previous org's chat. The by-id thread queries now authorize against the org you are acting in (not the thread's own org), and their query keys are org-scoped so the switch-time cache purge drops them. Tenant isolation was never broken — non-members could not read the data; this fixes context coherence for members of multiple orgs. (#2170)
- Issue desk — issues now render: The issue desk showed no issues even when untracked GitHub issues existed, because the integration list reader looked for
data/paginationat the top level while the connector payload lives under.result. A sharedreadIntegrationListPagehelper now unwraps the envelope (and tolerates a flat payload for forward compatibility). (#2175) - Actionable error messages: Convex redacts raw
throw new Error(...)to "Server Error" in production, so clients that branched on the message text were silently dead in prod. Expected-failure throws on knowledge/website duplicates, approval and human-input cards, and automation triggers now useConvexError({ code })mapped to localized, actionable messages in en/de/fr. (#2172, closes #2056) - Project chat list: Task and project discussion threads no longer leak into a project's chat folder —
listProjectThreadsnow applies the sharedisHiddenFromChatHistoryguard already used by the main chat list. (#2168)
For operators
Both items below are operator-facing but require no data migration. Upgrade as usual — tale upgrade then tale deploy — and compose is regenerated for you.
llm-gatewayrenamed tosandbox-llm-gateway(#2178). The bare name over-claimed scope: in-sandbox coding agents (Claude Code / OpenCode) are its only clients — regular chat calls providers directly from Convex and never touches it. The service, container, image (tale-llm-gateway→tale-sandbox-llm-gateway), build context, andLLM_GATEWAY_*env family are all renamed. Backward compatible for one release:tale upgrademigrates yourLLM_GATEWAY_*vars toSANDBOX_LLM_GATEWAY_*in place — the gateway admin password is preserved, never regenerated — and a transitional network alias plus env fallback keep in-flight sandbox sessions resolving across the deploy. Thellm-gateway-datavolume keeps its name (derived cache, re-provisioned per session). The transitional shims are removed next release.- Sandbox drops blue-green for in-place drain (#2179). The sandbox tier becomes a single container reached via the bare
sandboxalias, deployed roll-in-place after a drain — exactly likeconvex. Theplatformtier keeps its blue-green flip. This removes the deploy-time colour concept from the data layer and fixes a class of "fetch failed" chat turns: after a flip tore down a colour, a chat session pinned to the now-gonesandbox-<colour>host hard-failed its liveness probe forever. ThespawnerColorschema fields are kept deprecated-optional, so existing rows still read — no migration this release (a follow-up clears the values and drops the fields).
Full changelog: v0.2.92...v0.2.93