* improvement(repo): restructuring to make realtime image narrower scoped * improvements * chore(repo): rebase fixes and quality improvements for realtime split Addresses merge-time issues and gaps from the realtime app split: - Retarget stale vi.mock paths to @sim/workflow-persistence/subblocks - Restore README branding, fix AGENTS.md script reference - Restore TSDoc on workflow-persistence subblocks helpers - Use toError() from @sim/utils/errors in save.ts - Add vitest config + local mocks so @sim/audit tests run standalone - Move socket.io-client to devDependencies in apps/realtime - Add missing package COPY steps to docker/app.Dockerfile - Add check:boundaries/check:realtime-prune scripts and wire into CI Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(security): consolidate crypto primitives into @sim/security Move general-purpose crypto primitives out of apps/sim into the @sim/security package so both apps/sim and apps/realtime can share them. @sim/security exports (all pure, dependency-free): ./compare safeCompare (constant-time HMAC-wrapped equality) ./encryption encrypt/decrypt (AES-256-GCM, iv:cipher:tag format) ./hash sha256Hex ./tokens generateSecureToken (base64url) Migrate apps/sim call sites to use these + @sim/utils helpers: crypto.randomUUID() -> generateId() from @sim/utils/id createHash('sha256').digest -> sha256Hex timingSafeEqual on hashed hex -> safeCompare new Promise(setTimeout) -> sleep from @sim/utils/helpers No behavior change: encryption format, digest output, and token length are preserved exactly. * refactor(copilot): use toError in remaining otel/finalize sites Replace the last two `error instanceof Error ? error : new Error(String(error))` patterns with toError from @sim/utils/errors. Completes the sweep of clean candidates — no behavior change. * refactor(security): consolidate HMAC-SHA256 primitives into @sim/security Adds hmacSha256Hex and hmacSha256Base64 to @sim/security/hmac and migrates 15 webhook providers plus 5 other hot paths (deployment token signing, outbound webhook requests, workspace notification delivery, notification test route, Shopify OAuth callback) off bare `createHmac` calls. Secret parameter accepts `string | Buffer` to cover base64-decoded Svix-style secrets (Resend) and MS Teams' HMAC scheme. AWS SigV4 signing in S3 and Textract tools intentionally retains direct `createHmac` usage — its multi-step key derivation chain doesn't fit a generic helper. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(packages): post-audit test + packaging polish - Add safeCompare unit tests (identity, length mismatch, hex-nibble diff). - Add Buffer-secret cases to hmac tests to lock in Svix/MS-Teams contract. - Declare `reactflow` as a peerDependency on @sim/workflow-types — only used for type imports. - Add a barrel export to @sim/workflow-persistence for consumers that prefer package-level imports; subpath exports retained. - Document the data-field invariant in load.ts for loop/parallel subflow patching. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(realtime): address PR review feedback - Remove redundant SOCKET_PORT=3002 env from Dockerfile runner stage (env.PORT already defaults to 3002 via zod schema). - Reorder PORT fallback so an explicitly-set SOCKET_PORT wins over the schema default for PORT; keeps SOCKET_PORT functional as an override instead of dead code. - Add dedicated type-check CI step for @sim/realtime so TS errors surface pre-deploy (the Dockerfile runs source TS via Bun and has no implicit build-time type check). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(realtime): remove unused SOCKET_PORT env var SOCKET_PORT has lived in the socket server since the June 2025 refactor but was never actually set in any deploy config — docker-compose.prod, helm values/templates, .env.example, and docs all use PORT or the 3002 default exclusively. No self-hoster was ever pointed at SOCKET_PORT, so removing it is safe. Simplifies realtime port resolution to `env.PORT` (zod-validated with a 3002 default) and drops the orphaned sim-side schema entry. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Waleed Latif <walif6@gmail.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Sim Development Container
Development container configuration for VS Code Dev Containers and GitHub Codespaces.
Prerequisites
- Visual Studio Code
- Docker Desktop or Podman Desktop
- VS Code Dev Containers extension
Getting Started
- Open this project in VS Code
- Click "Reopen in Container" when prompted (or press
F1→ "Dev Containers: Reopen in Container") - Wait for the container to build and initialize
- Start developing with
sim-start
The setup script will automatically install dependencies and run migrations.
Development Commands
Running Services
You have two options for running the development environment:
Option 1: Run everything together (recommended for most development)
sim-start # Runs both app and socket server using concurrently
Option 2: Run services separately (useful for debugging individual services)
- In the app container terminal:
sim-app(starts Next.js app on port 3000) - In the realtime container terminal:
sim-sockets(starts socket server on port 3002)
Other Commands
sim-migrate- Push schema changes to the databasesim-generate- Generate new migrationsbuild- Build the applicationpgc- Connect to PostgreSQL database
Troubleshooting
Build errors: Rebuild the container with F1 → "Dev Containers: Rebuild Container"
Port conflicts: Ensure ports 3000, 3002, and 5432 are available
Container runtime issues: Verify Docker Desktop or Podman Desktop is running
Technical Details
Services:
- App container (8GB memory limit) - Main Next.js application
- Realtime container (4GB memory limit) - Socket.io server for real-time features
- Database - PostgreSQL with pgvector extension
- Migrations - Runs automatically on container creation
You can develop with services running together or independently.
Personalization
Project commands (sim-start, sim-app, etc.) are automatically available via /workspace/.devcontainer/sim-commands.sh.
Personal shell customization (aliases, prompts, etc.) should use VS Code's dotfiles feature:
- Create a dotfiles repository (e.g.,
github.com/youruser/dotfiles) - Add your
.bashrc,.zshrc, or other configs - Configure in VS Code Settings:
{ "dotfiles.repository": "youruser/dotfiles", "dotfiles.installCommand": "install.sh" }
This separates project-specific commands from personal preferences, following VS Code best practices.