Skip to content

Releases: deepdotspace/deepspace

v0.7.0

Choose a tag to compare

@donalddellapietra donalddellapietra released this 30 Jul 01:59

Minor Changes

  • Client-side error reporting (opt-in) for deepspace logs. Browser JS errors never invoke the Worker, so they never reached Workers Logs. New installClientErrorReporter() (client) hooks window 'error'/'unhandledrejection' and forwards each to the app's own Worker via registerClientErrorRoute(app) (POST /_deepspace/client-errors), which logs them so they appear in deepspace logs and the dashboard tagged CLIENT. Also exports reportClientError() 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 logs wire DTO as a single source of truth (AppLogEvent, AppLogsResponse, LogLevel, LOG_LEVELS, APP_LOG_EVENT_KEYS) from both deepspace and deepspace/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 (from deepspace) and registerClientErrorRoute / handleClientErrorReport / CLIENT_LOG_MARKER (from deepspace/worker), plus the ClientErrorReport type; 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 a minor.)

  • New deepspace logs command: 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; --follow tails by polling (~3s), --since/--level/--search/--limit narrow the window, --json emits 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-deepspace now assembles apps from a shared base plus per-template overlays. Choose a template with --template <name> (or -i for an interactive picker); starter remains the default.
    • New copilot template: a three-panel shell (collapsible sidebar, a main content panel, and an AI chat dock) with light and dark themes.

v0.6.2

Choose a tag to compare

@donalddellapietra donalddellapietra released this 17 Jul 17:14

Patch Changes

  • RecordRoom now gates its HTTP debug API (/api/debug/*) behind ALLOW_DEBUG_ROUTES at 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_MODELS now 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 sends reasoningEffort: '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 upgrade deepspace must add the new model ids to their ALLOWED_MODELS in src/ai/chat-routes.ts AND add the same providerOptions: { openai: { reasoningEffort: 'none' } } to their streamText call for OpenAI models (or pass their own models prop to ChatPanel) — 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-sockets endpoint (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, so useQuery
    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. --json emits the raw summary for scripts and agents. Previously the only balance surface was the web dashboard, which agents driving deepspace invoke can't read.

v0.6.1

Choose a tag to compare

@donalddellapietra donalddellapietra released this 16 Jul 20:42

Patch Changes

  • Make silent failures visible. RecordProvider now accepts an onWriteError prop ((error: WriteError) => void, where WriteError is { 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 loud console.error explaining 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 routes onWriteError to its toast system out of the box (permission → warning toast, validation → error toast). On localhost, a signed-out RecordProvider without allowAnonymous renders a visible diagnostic instead of a blank page (production still renders nothing), and passing schemas alongside roomId (where it's ignored) warns once; both diagnostics can be forced on or off via globalThis.DEEPSPACE_DEV = true | false (LAN/tunnel previews, consumer test suites). deepspace dev and deepspace deploy now run schema lint up front and print findings (e.g. a visibilityField no 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

Choose a tag to compare

@donalddellapietra donalddellapietra released this 16 Jul 20:50

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 new deepspace collaborators cancel <email> rescinds a pending invite, and collaborators list now shows outstanding invites alongside active collaborators.

Patch Changes

  • deepspace deploy on a repo without DEEPSPACE_APP_ID no 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 --adopt for non-interactive runs); a name owned by an app you can't deploy fails up front with the real reason.

v0.5.7

Choose a tag to compare

@donalddellapietra donalddellapietra released this 13 Jul 16:53

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.