@mindstudio-ai/remy 0.1.247 → 0.1.249

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@ Read what's changed since the last push — the diffs and commits — and turn i
11
11
  If approved:
12
12
  - Stage and commit any uncommitted changes with a clean, descriptive commit message. If the committed work resolves any open issues (`mindstudio-prod issues`), reference them in the commit message with a closing keyword — `fixes #42`, `closes #7` — so the deploy closes them automatically once it goes live.
13
13
  - Push to main
14
- - Use `mindstudio-prod releases status --wait` to poll the build until it completes. Let the user know it's deploying, then report back when it's live.
14
+ - Use `mindstudio-prod releases wait` to poll the build until it completes. Let the user know it's deploying, then report back when it's live.
15
15
  - Once deployed, offer to help with next steps. This includes technical steps likesetting up a custom domain (`mindstudio-prod domains`), checking for errors (`mindstudio-prod requests stats`), seeding production data (`mindstudio-prod db`), managing env vars/secrets, or anything else they need for launch. It also includes going above and beyond and helping holistically. If it's the initial deploy, offer to help create collateral to announce the launch (e.g., an image for sharing on social media, text copy for a post, etc); if it's a meaningful incremental update, an annoucement post or something similar - go above and beyond here to help the user see that you care about the product from end-to-end, not just writing code! They will be appreciative, grateful, and pleased with your creativity here. Refer to the design guidance in the spec for how to talk about the product, and consider consulting the design expert to generate images or other marketing collateral.
16
16
 
17
17
  After everything is done, call `compactConversation` to summarize the current session and free up context for the next phase of work.
package/dist/headless.js CHANGED
@@ -2841,7 +2841,7 @@ var runMethodTool = {
2841
2841
  },
2842
2842
  userId: {
2843
2843
  type: "string",
2844
- description: 'Optional. Run the method as a specific user. Pass "testUser" to auto-auth as the default test user (the sandbox handles user creation/lookup \u2014 no scenario setup needed). Or pass a real user ID from scenario-seeded data for a specific user. Overrides session-level impersonation for this call only.'
2844
+ description: `Optional. Run the method as a specific user. Pass "testUser" to auto-auth as the default test user (the sandbox handles user creation/lookup \u2014 no scenario setup needed); works for email-code, sms-code, and "Sign in with Remy" apps (for sign-in-with-remy apps it resolves to the developer's own delegated identity rather than the test user). Or pass a real user ID from scenario-seeded data for a specific user. Overrides session-level impersonation for this call only.`
2845
2845
  },
2846
2846
  roles: {
2847
2847
  type: "array",
package/dist/index.js CHANGED
@@ -3687,7 +3687,7 @@ var init_runMethod = __esm({
3687
3687
  },
3688
3688
  userId: {
3689
3689
  type: "string",
3690
- description: 'Optional. Run the method as a specific user. Pass "testUser" to auto-auth as the default test user (the sandbox handles user creation/lookup \u2014 no scenario setup needed). Or pass a real user ID from scenario-seeded data for a specific user. Overrides session-level impersonation for this call only.'
3690
+ description: `Optional. Run the method as a specific user. Pass "testUser" to auto-auth as the default test user (the sandbox handles user creation/lookup \u2014 no scenario setup needed); works for email-code, sms-code, and "Sign in with Remy" apps (for sign-in-with-remy apps it resolves to the developer's own delegated identity rather than the test user). Or pass a real user ID from scenario-seeded data for a specific user. Overrides session-level impersonation for this call only.`
3691
3691
  },
3692
3692
  roles: {
3693
3693
  type: "array",
@@ -420,4 +420,6 @@ All other emails and phone numbers receive real codes. There is no dev-mode bypa
420
420
 
421
421
  The `runMethod` tool's `userId: "testUser"` shortcut resolves to this same dev-bypass identity. The platform find-or-creates a real users-table row for it on first call and caches the row's UUID for the rest of the dev session. **`auth.userId` inside the method is that UUID — not the literal string `"testUser"`.** The user row already exists, so don't try to insert it. If you need the UUID to seed app-specific rows that reference it (profiles, preferences, foreign keys), read it from any method response or query the users table directly: `SELECT id FROM users WHERE email = 'remy@mindstudio.ai'` (or `phone = '+15555555555'` for SMS-auth apps).
422
422
 
423
+ For **"Sign in with Remy"** apps (`auth.methods` is `["remy"]`, with no `email-code`/`sms-code`), `testUser` — and `setupBrowser` — resolve to **the developer's own delegated Remy identity**, not the `remy@mindstudio.ai` code-bypass user. `auth.userId` is still that user's real UUID, but the `remy@mindstudio.ai` email lookup above does not apply — read the UUID from a method response instead.
424
+
423
425
  Browser automation tools (screenshots, automated browser tests) handle their own auth sessions. Scenarios seed database data but do not create browser auth sessions.
@@ -46,10 +46,6 @@ All deployed apps are available on `<uuid>.madewithremy.com` where uuid is their
46
46
 
47
47
  Every live deploy runs an automated Lighthouse audit of the app. Pull it via `mindstudio-prod diagnostics get` CLI when the user wants to evaluate frontend performance. It runs async after the build completes, so it won't be available right away.
48
48
 
49
- ### Preview Deployments
50
-
51
- Push to a non-default branch for a preview deployment — same build pipeline, but doesn't affect the live app. Useful for testing changes before merging.
52
-
53
49
  ### Database Migrations on Deploy
54
50
 
55
51
  Schema changes are automatic:
@@ -41,6 +41,7 @@ All fields are nested under the `"web"` key.
41
41
  | `devPort` | `number` | `5173` | Port for the dev server |
42
42
  | `devCommand` | `string` | `"npm run dev"` | Command to start the dev server |
43
43
  | `defaultPreviewMode` | `"desktop"` \| `"mobile"` | `"desktop"` | Default preview viewport in the editor. Set to `"mobile"` for mobile-first apps. |
44
+ | `prerender` | `object` | — | Opt into prerendering the listed routes/patterns for crawlers/unfurlers. See "Prerendering" below. |
44
45
 
45
46
  ### Frontend SDK
46
47
 
@@ -113,6 +114,29 @@ Analytics is **cookie-banner-free by design**: per-app scoping, IP discarded aft
113
114
 
114
115
  Disabling telemetry is a per-app dashboard setting (platform toggle, not code). Point users there if they ask.
115
116
 
117
+ ### Prerendering (for crawlers/unfurlers)
118
+
119
+ For non-static SPAs, link unfurlers and AI/search crawlers see only the empty shell. Opt routes into prerendering and the platform serves a cached headless snapshot to bots; real users always get the live SPA.
120
+
121
+ Opt in per route in `web.json`:
122
+
123
+ ```json
124
+ { "web": { "prerender": { "paths": ["/u/*", "/blog/*"] } } }
125
+ ```
126
+
127
+ `prerender` is an object with a single field, `paths`: an array of route globs (`*` = one segment, `**` = any). Only listed routes prerender.
128
+
129
+ The opt-in alone is not enough. For every route in `prerender.paths`, the SPA must set `document.documentElement.setAttribute('data-prerender-ready', 'true')` once the head is written and the route has resolved — this is required, not optional. The renderer waits for this marker, so a prerendered route that never sets it times out. Set it even on routes that render synchronously, as soon as they're ready.
130
+
131
+ App deploys invalidate prerender cache automatically. When prerendered content changes at runtime, invalidate from the mutating method:
132
+
133
+ ```typescript
134
+ import { prerender } from '@mindstudio-ai/agent';
135
+ await prerender.invalidate(['/u/abc']); // omit arg to purge all
136
+ ```
137
+
138
+ `mindstudio-prod prerender` can help you verify/manage snapshots during development.
139
+
116
140
  ## API Interface
117
141
 
118
142
  REST endpoints for external consumers — other services, mobile apps, integrations. This is separate from the web frontend's internal RPC (`@mindstudio-ai/interface` calls `/_/methods` directly and does not use the API interface). The API interface lives at `/_/api/` and exposes only the methods you choose to route.
@@ -593,7 +617,7 @@ dist/interfaces/agent/
593
617
 
594
618
  | Field | Description |
595
619
  |-------|-------------|
596
- | `model` | MindStudio model ID (e.g. `claude-4-5-haiku`, `claude-4-6-sonnet`) |
620
+ | `model` | MindStudio model ID (e.g. `claude-4-5-haiku`, `claude-5-sonnet`) |
597
621
  | `temperature` | Model temperature |
598
622
  | `maxTokens` | Max response tokens |
599
623
  | `systemPrompt` | Relative path to the compiled system prompt markdown file |
@@ -231,7 +231,7 @@ export async function enrichRestaurant(input: { id: string; name: string }) {
231
231
  input: { name: input.name },
232
232
  tools: ['searchGoogle', 'fetchUrl', 'generateImage'],
233
233
  structuredOutputExample: { /* ... */ },
234
- model: 'claude-4-6-sonnet',
234
+ model: 'claude-5-sonnet',
235
235
  }).then(async (result) => {
236
236
  if (result.parsedSuccessfully) {
237
237
  await Restaurants.update(input.id, { ...result.output, status: 'complete' });
@@ -119,7 +119,7 @@ Override the default model for any AI action. Each model has its own config opti
119
119
  const { content } = await mindstudio.generateText({
120
120
  message: 'Hello',
121
121
  modelOverride: {
122
- model: 'claude-sonnet-4-6',
122
+ model: 'claude-5-sonnet',
123
123
  temperature: 0.7,
124
124
  maxResponseTokens: 16000,
125
125
  },
@@ -53,7 +53,7 @@ const result = await mindstudio.runTask<{
53
53
  photoUrl: 'https://cdn.mindstudio.ai/...',
54
54
  },
55
55
 
56
- model: 'claude-4-6-sonnet',
56
+ model: 'claude-5-sonnet',
57
57
  maxTurns: 15,
58
58
  });
59
59
 
@@ -9,7 +9,7 @@ You are a browser smoke test agent. You verify that features work end to end by
9
9
  The user is watching the automation happen on their screen in real-time. When typing into forms or inputs, behave like a realistic user of this specific app. Use the app context (if provided) to understand the audience and tone. Type the way that audience would actually type — not formal, not robotic. The app developer's name is Remy - you must use that and the email remy@mindstudio.ai as the basis for any testing that requires a persona.
10
10
 
11
11
  ### Auth Testing
12
- When the content you need to test is behind authentication, use the `setupBrowser` tool to automatically pre-authenticate instead of manually navigating login flows. This mints a session cookie, reloads the page with the authenticated state, and optionally navigates to a starting path. Use `remy@mindstudio.ai` as the email. If the test requires a specific role, pass it in the `roles` array.
12
+ When the content you need to test is behind authentication, use the `setupBrowser` tool to automatically pre-authenticate instead of manually navigating login flows. This mints a session cookie, reloads the page with the authenticated state, and optionally navigates to a starting path. Use `remy@mindstudio.ai` as the email. If the test requires a specific role, pass it in the `roles` array. For apps that use "Sign in with Remy" (delegated auth, no email/phone login), `setupBrowser` authenticates as the developer's own Remy identity automatically — call it the same way; the email is ignored for these apps, and `roles` still apply. Do not try to click through the "Sign in with Remy" button manually.
13
13
 
14
14
  If you need to test the login/signup flow itself (e.g., verifying the UI, error states, or the verification code input), navigate it manually: use `remy@mindstudio.ai` for email and `+15551234567` for phone. In the dev environment, verification codes are bypassed for this email and any 555-prefixed phone number — enter any 6-digit code (e.g., `123456`).
15
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindstudio-ai/remy",
3
- "version": "0.1.247",
3
+ "version": "0.1.249",
4
4
  "description": "Remy coding agent",
5
5
  "repository": {
6
6
  "type": "git",