Releases: deepdotspace/deepspace
Release list
v0.7.0
Minor Changes
-
Client-side error reporting (opt-in) for
deepspace logs. Browser JS errors never invoke the Worker, so they never reached Workers Logs. NewinstallClientErrorReporter()(client) hookswindow'error'/'unhandledrejection' and forwards each to the app's own Worker viaregisterClientErrorRoute(app)(POST /_deepspace/client-errors), which logs them so they appear indeepspace logsand the dashboard taggedCLIENT. Also exportsreportClientError()for React error boundaries. Off by default (no starter wiring); anonymous ingestion is size-capped, deduped, and throttled, and — because the route runs in the tenant's own Worker — a browser can only ever write to its own app's log stream.Also exports the
deepspace logswire DTO as a single source of truth (AppLogEvent,AppLogsResponse,LogLevel,LOG_LEVELS,APP_LOG_EVENT_KEYS) from bothdeepspaceanddeepspace/worker, so the CLI, dashboard, and platform reader share one definition instead of hand-mirrored copies. The client-error module's public surface is limited to the user-facing entry points —installClientErrorReporter/reportClientError(fromdeepspace) andregisterClientErrorRoute/handleClientErrorReport/CLIENT_LOG_MARKER(fromdeepspace/worker), plus theClientErrorReporttype; the wire-protocol internals are no longer exported. (Those internals were only ever exported by this same, still-unreleased feature, so no released consumer is affected — this stays aminor.) -
New
deepspace logscommand: read a deployed app's production logs (console output, request summaries, exceptions with stacks) from Workers Logs — no Cloudflare dashboard needed. Defaults to the last 15 minutes;--followtails by polling (~3s),--since/--level/--search/--limitnarrow the window,--jsonemits NDJSON for agents. Logs appear within ~1 minute of a request and are retained for 7 days. -
Rework the scaffolder around a clean starter and a template system.
- The starter template is rebuilt on a Base UI-backed primitive kit (Dialog/Modal, Select, DropdownMenu, Popover, Tooltip, Tabs, and form controls) with a minimal, unopinionated shell, so scaffolded apps start from a neutral base and design their own look.
npx create-deepspacenow assembles apps from a shared base plus per-template overlays. Choose a template with--template <name>(or-ifor an interactive picker);starterremains the default.- New
copilottemplate: a three-panel shell (collapsible sidebar, a main content panel, and an AI chat dock) with light and dark themes.
v0.6.2
Patch Changes
- RecordRoom now gates its HTTP debug API (
/api/debug/*) behindALLOW_DEBUG_ROUTESat the Durable Object's own ingress, matching the app-worker proxy gate. Enforcement lives at the one place every caller funnels through, so it can no longer be bypassed by a caller that forgets to gate. The platform's shared-data rooms hard-disable the debug API entirely. No change for apps that already gate via the proxy. - Refresh the AI chat model lineup to the current generation. ChatPanel's default picker and the scaffolded starter's
ALLOWED_MODELSnow offer Claude Sonnet 5 (new default), Claude Opus 4.8, Claude Haiku 4.5, and the GPT-5.6 family (Sol / Terra / Luna) alongside GPT-OSS 120B; the retired-generation entries (Sonnet 4.6, Opus 4.7, the GPT-5.4 picker rows) are dropped from the picker, while their ids stay server-allowlisted. The scaffolded chat route now sendsreasoningEffort: 'none'for OpenAI models — GPT-5.6 on /v1/chat/completions rejects function tools otherwise ("Function tools with reasoning_effort are not supported"). Apps scaffolded before this release that upgradedeepspacemust add the new model ids to theirALLOWED_MODELSinsrc/ai/chat-routes.tsAND add the sameproviderOptions: { openai: { reasoningEffort: 'none' } }to theirstreamTextcall for OpenAI models (or pass their ownmodelsprop toChatPanel) — otherwise the picker's new ids are rejected with a 400 by design, and GPT-5.6 turns with tools error. - Add
BaseRoom.disconnectAllSockets({ code?, reason? })and a built-in internal
POST /internal/disconnect-socketsendpoint (every room type,RecordRoom
included). Use it after an out-of-band, server-side write (admin import,
migration script, cron, server action) to close every live WebSocket (default
close 1012 /state-refresh) so clients reconnect and fully resync — no more
stale editors autosaving over server-side writes. Internal-only: reachable via
DO stub fetch from the app worker, same trust model as/api/tools/execute.
The client already reconnects and re-subscribes on any close, souseQuery
consumers get fresh data automatically. - Add
deepspace usage— credit balance, quota headroom (per-bucket breakdown with renewal/expiry dates), and per-integration spend for the last 30 days, from the platform's billing ledger.--jsonemits the raw summary for scripts and agents. Previously the only balance surface was the web dashboard, which agents drivingdeepspace invokecan't read.
v0.6.1
Patch Changes
- Make silent failures visible.
RecordProvidernow accepts anonWriteErrorprop ((error: WriteError) => void, whereWriteErroris{ kind: 'permission' | 'validation', title, detail }) — previously the friendly-error pipeline (server rejection →parseServerError→ callback) was unreachable from the public API, so a denied or invalid optimistic write looked like a success with no signal anywhere. Unhandled rejections fall back to a loudconsole.errorexplaining how to wire real UI (note: this fires in production too — existing apps that never wired a handler will start logging rejected writes to the console; each unique error logs once, repeats are suppressed), and the starter template routesonWriteErrorto its toast system out of the box (permission → warning toast, validation → error toast). On localhost, a signed-outRecordProviderwithoutallowAnonymousrenders a visible diagnostic instead of a blank page (production still renders nothing), and passingschemasalongsideroomId(where it's ignored) warns once; both diagnostics can be forced on or off viaglobalThis.DEEPSPACE_DEV = true | false(LAN/tunnel previews, consumer test suites).deepspace devanddeepspace deploynow run schema lint up front and print findings (e.g. avisibilityFieldno role enforces) in the terminal, capped at 5 with an overflow count — previously these only appeared in the worker console after a client connected.
v0.6.0
Minor Changes
deepspace collaborators add <email>can now invite someone who isn't a DeepSpace user yet: it sends them an email invitation (billed to the app owner) and they become a collaborator when they sign in and accept it. The newdeepspace collaborators cancel <email>rescinds a pending invite, andcollaborators listnow shows outstanding invites alongside active collaborators.
Patch Changes
deepspace deployon a repo withoutDEEPSPACE_APP_IDno longer silently mints a fresh id destined for a route-claim collision when the name belongs to an existing app. Adoption now also recognizes legacy name-as-id apps the caller deploys on-behalf (collaborator or admin): adopting an app you own stays automatic; adopting one you don't own asks for confirmation (or--adoptfor non-interactive runs); a name owned by an app you can't deploy fails up front with the real reason.
v0.5.7
Patch Changes
- Relicense to Apache-2.0 (from the next release onward), add LICENSE files, repository/homepage/bugs metadata, alpha notices, and a README for create-deepspace. Source is now published to the public mirror repo at https://github.com/deepdotspace/deepspace on every release.