@tomorrowos/sdk 0.9.32 → 0.9.33

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.
package/VERCEL_SETUP.md CHANGED
@@ -5,7 +5,10 @@
5
5
  >
6
6
  > **On Vercel, this file is the setup questionnaire** (not `REPLIT_SETUP.md`, not `LLM_PROMPT.md`).
7
7
  >
8
- > Protocol id: `vercel-setup/1.8` — pairs with `@tomorrowos/sdk` **0.9.32+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
8
+ > Protocol id: `vercel-setup/1.9` — pairs with `@tomorrowos/sdk` **0.9.33+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
9
+ >
10
+ > **Copy questions verbatim from this file.** Do not invent alternate Q2 options (no “Supabase Storage”, no “disable media”, no making Blob the recommended option).
11
+ > **`TOMORROWOS_STORE` and `DATABASE_SSL` are agent-only** — set them automatically after Q1; never put them in a user-facing Env form for the customer to type.
9
12
 
10
13
  ## User trigger (copy-paste)
11
14
 
@@ -13,15 +16,13 @@ When a human pastes a prompt like this, **read this file and start Question 1 im
13
16
 
14
17
  ```text
15
18
  Follow @tomorrowos/sdk VERCEL_SETUP.md and set up my TomorrowOS CMS.
16
- Ask only the questions listed in VERCEL_SETUP.md, in order. Do not use LLM_PROMPT.md or REPLIT_SETUP.md.
17
- Do not ask for OpenAI / Anthropic / any LLM API keys — TomorrowOS CMS setup does not require them.
18
- If any step contradicts Vercel, adapt to settings Vercel can accept (document the adaptation).
19
- After all setup questions are answered (including Cloudinary or Vercel Blob Env Vars if you chose those), configure and deploy minimal verification only (Control Panel at /). Prefer Supabase Session pooler URL or Neon pooled URL. Do not treat sandbox ENETUNREACH / IPv6 :5432 errors as a hard setup failure when a pooler URL is configured for production.
20
- Question 3 only updates brand.json from colours/logo/name (a website URL is brand reference only do not add CMS login/auth unless the user explicitly asks). Do not skip steps.
21
- Use Next.js only as a v0/Preview shell with a reverse proxy; Production Publish must remain pure Node TomorrowOS.listen (not Next).
22
- Before claiming Publish works: Framework Preset must be Other/null (not Next.js), Fluid on, GET /status on the production URL must return JSON (not HTML), GET / must return the Control Panel, and WebSocket upgrade on / or /api must return 101 (not 200 HTML).
23
- Do not put startCommand or processes in vercel.json (v0 schema rejects them).
24
- Use cms-starter-v0 layout: cms-app.ts + api/index.ts (export default server) + cms-panel/ + rewrites to /api. Do not create a second TomorrowOS instance in api/ws.ts.
19
+ Ask only the questions listed in VERCEL_SETUP.md, in order — copy Question 1/2/3 wording verbatim. Do not use LLM_PROMPT.md or REPLIT_SETUP.md.
20
+ Do not ask for OpenAI / Anthropic / any LLM API keys.
21
+ Question 2 MUST be exactly: 1 Cloudinary (recommended), 2 Vercel Blob, 3 local disk. NEVER offer Supabase Storage, “no media storage”, or Blob as recommended.
22
+ After I choose a database, YOU set TOMORROWOS_STORE and DATABASE_SSL automaticallydo not ask me to fill those two Env Vars.
23
+ If any step contradicts Vercel, adapt to settings Vercel can accept (document the adaptation). Prefer Supabase Session pooler or Neon pooled URL.
24
+ Question 3 only updates brand.json (website URL = brand reference only no CMS login unless I ask).
25
+ Use cms-starter-v0 layout. Publish = Fluid Function (api/index.ts). Preview may use Next proxy.
25
26
  ```
26
27
 
27
28
  Alternate triggers:
@@ -128,30 +129,43 @@ v0 Preview is often a **Next.js runtime** hardwired to `next dev`. A raw `tsx se
128
129
 
129
130
  ## Questionnaire scope (STRICT)
130
131
 
131
- Ask **only** these questions, in **this exact order**:
132
+ Ask **only** these questions, in **this exact order**. **Copy the “Ask exactly” blocks verbatim** — do not paraphrase options.
132
133
 
133
134
  | Step | Section | When |
134
135
  |------|---------|------|
135
136
  | 1 | **Question 1** — Database (Supabase → Neon → SQLite) | Always |
136
- | 2 | **Question 2** — Media storage (Cloudinary → Vercel Blob → local) | Always (after Q1) |
137
+ | 2 | **Question 2** — Media (**Cloudinary recommended** → Vercel Blob → local) | Always (after Q1) |
137
138
  | 3 | **Question 3** — Brand / TomorrowOS look (`brand.json` only) | Always last |
138
139
 
139
140
  **That is the complete list.** Do **not** ask how many screens / devices.
140
141
 
142
+ **Forbidden invented Question 2 options (never offer these in chat or UI):**
143
+
144
+ - ❌ “Vercel Blob **(recommended)**” as option 1 — Blob is option **2**, not recommended over Cloudinary
145
+ - ❌ “Supabase Storage” / S3 bucket / `SUPABASE_SERVICE_ROLE_KEY` for media
146
+ - ❌ “No media storage” / “disable media uploads” / “remote URLs only” as a numbered choice
147
+ - ❌ Any media list that does not start with **Cloudinary (recommended)**
148
+
149
+ **Forbidden Env UX after Question 1:**
150
+
151
+ - ❌ Showing the user empty fields for `TOMORROWOS_STORE` or `DATABASE_SSL` to fill
152
+ - ❌ Asking in chat “what should TOMORROWOS_STORE be?”
153
+ - ✅ After DB choice + URL paste: **you** write those two vars silently (see Q1 Steps B/C/D)
154
+
141
155
  **Forbidden extra questions (never ask, even if the user skips a step):**
142
156
 
143
157
  - ❌ OpenAI / Anthropic / Gemini / any LLM API key (`sk-…`, etc.)
144
158
  - ❌ “AI pairing”, “AI feature logic”, or inventing auth that needs an LLM key
145
- - ❌ Asking the user to type `TOMORROWOS_STORE` or `DATABASE_SSL` after they already chose Neon/Supabase — **you set those automatically**
159
+ - ❌ Asking the user to type `TOMORROWOS_STORE` or `DATABASE_SSL`
146
160
  - ❌ Any secret not listed in Questions 1–3 (DB URL, media credentials, brand)
147
161
 
148
162
  TomorrowOS pairing and Control Panel logic live in `@tomorrowos/sdk`. They do **not** call OpenAI.
149
163
 
150
- If the user **skips** a Question 2 option, do **not** invent a substitute question. Re-state Question 2 choices, or proceed with a documented default (e.g. local uploads with a warning) — never pivot to LLM keys.
164
+ If the user **skips** a Question 2 option, do **not** invent a substitute question. Re-state Question 2 choices **verbatim**, or proceed with local uploads + warning — never pivot to LLM keys or Supabase Storage.
151
165
 
152
166
  If the user says “just set it up, don’t ask questions,” respond:
153
167
 
154
- > I need a few quick answers from VERCEL_SETUP.md (database — Supabase or Neon preferred — media storage, and branding). It takes about a minute and ensures the CMS works on Vercel.
168
+ > I need a few quick answers from VERCEL_SETUP.md (database — Supabase or Neon preferred — media storage with Cloudinary recommended, and branding). It takes about a minute and ensures the CMS works on Vercel.
155
169
 
156
170
  Then ask **Question 1**.
157
171
 
@@ -159,26 +173,26 @@ Then ask **Question 1**.
159
173
 
160
174
  ## Hard rules
161
175
 
162
- 1. **Ask only VERCEL_SETUP.md questions 1–3.** Never use `LLM_PROMPT.md` or `REPLIT_SETUP.md` as the questionnaire. **Never** ask for OpenAI or other LLM API keys.
163
- 2. **Cloudinary:** open **one** Vercel Env configuration popup / form with **all** Cloudinary fields together (cloud name + API key + API secret). Do **not** quiz the user one credential at a time in chat.
164
- 3. **Do not invent** Cloudinary credentials, database URLs, Vercel Blob tokens, brand colours, **or LLM API keys**.
165
- 4. **Postgres env naming:** prefer **`SUPABASE_URL`** when using Supabase; prefer **`DATABASE_URL`** when using Neon. `createTomorrowOSStore` accepts `SUPABASE_URL` then `DATABASE_URL`.
166
- 5. **Always prefer pooled connection strings** (Supabase Session pooler port **6543**; Neon pooled host). Direct `:5432` URLs commonly fail on Vercel/sandbox with **`ENETUNREACH`** (often IPv6).
167
- 6. **Prefer `npx @tomorrowos/sdk init --hosting v0`** (template `cms-starter-v0`: `cms-app.ts`, `api/index.ts`, `cms-panel/`, Fluid + rewrites). For Replit/Railway use default `init` (`cms-starter`). Do not rebuild pairing / WebSocket / playlist APIs.
168
- 7. **Never commit secrets.** Use Vercel Environment Variables (+ optional non-secret flags in committed `.env.example`).
169
- 8. **Skip Replit-only files:** do **not** create `.replit`, `.replit-artifact`, or Replit `deploymentTarget`.
170
- 9. **SQLite is not a production store on Vercel.** Offer it only as option **3** after explicit warning. Keep `sqlitePath` as local-dev fallback in `createTomorrowOSStore`.
171
- 10. **Enable Fluid compute** for Production WebSockets ([docs](https://vercel.com/docs/functions/websockets)). Confirm Project settings after scaffold.
172
- 11. **Production:** one Vercel Function exports `http.Server` from `TomorrowOS.listen` (`api/index.ts`). **Do not** make `next start` the Production entrypoint. **Do not** spin a second TomorrowOS in `api/ws.ts`.
173
- 12. **Preview:** if the environment is v0 / Next-hardwired, install the Next reverse-proxy shell (see **Preview adapter**). Do not leave Preview broken.
174
- 13. After Q&A: **configure → install → run/deploy minimal verify** (Control Panel at `/` + WS 101). Do not run a long test suite.
175
- 14. **No inventing CMS login.** A branding URL never means “build auth.” Only add login if the user **explicitly** requests it.
176
- 15. **Skip invent.** If the user skips media choice or a credential, do not replace it with OpenAI/auth/login questions. Stay on Q1–Q3 only.
177
- 16. **Neon / Supabase helpers are agent-owned.** After the user pastes the DB URL, **you** set `TOMORROWOS_STORE` and `DATABASE_SSL` automatically — **do not** ask the user to fill those two.
178
- 17. **Publish gate:** do not mark setup complete while Production returns `404: NOT_FOUND`, `/status` returns HTML, **or** WebSocket upgrade returns 200 HTML instead of 101.
179
- 18. **Scheme A is doc-driven:** Production = Fluid Function + `export default server` per Vercel WebSockets docs — Replit starter stays unchanged.
180
-
181
- **Question order:** Q1 → Q2 → Q3 → execution checklist.
176
+ 1. **Ask only VERCEL_SETUP.md questions 1–3, verbatim.** Never use `LLM_PROMPT.md` or `REPLIT_SETUP.md` as the questionnaire. **Never** ask for OpenAI or other LLM API keys.
177
+ 2. **Question 2 options are fixed:** (1) Cloudinary **(recommended)**, (2) Vercel Blob, (3) local disk. Do not reorder; do not invent Supabase Storage / disable-uploads.
178
+ 3. **Cloudinary:** open **one** Vercel Env popup with **all** Cloudinary fields together. Do **not** quiz one credential at a time.
179
+ 4. **`TOMORROWOS_STORE` + `DATABASE_SSL` = agent-owned.** After Q1 choice (and URL if needed), set them yourself in Vercel Env Vars. **Never** include them as blank fields for the customer. Mapping: Supabase `TOMORROWOS_STORE=supabase` + `DATABASE_SSL=true`; Neon `TOMORROWOS_STORE=postgres` + `DATABASE_SSL=true`; SQLite → `TOMORROWOS_STORE=sqlite` (no `DATABASE_SSL` required).
180
+ 5. **Do not invent** Cloudinary credentials, database URLs, Vercel Blob tokens, brand colours, **or LLM API keys**.
181
+ 6. **Postgres env naming:** prefer **`SUPABASE_URL`** for Supabase; prefer **`DATABASE_URL`** for Neon.
182
+ 7. **Always prefer pooled connection strings** (Supabase Session pooler **6543**; Neon pooled host).
183
+ 8. **Prefer `npx @tomorrowos/sdk init --hosting v0`**. For Replit/Railway use default `init`. Do not rebuild pairing / WebSocket APIs.
184
+ 9. **Never commit secrets.** Use Vercel Environment Variables.
185
+ 10. **Skip Replit-only files.**
186
+ 11. **SQLite is not a production store on Vercel.**
187
+ 12. **Enable Fluid compute** for Production WebSockets.
188
+ 13. **Production:** `api/index.ts` exports `http.Server` from `TomorrowOS.listen`. Not `next start`. No second TomorrowOS in `api/ws.ts`.
189
+ 14. **Preview:** Next reverse-proxy shell when v0 is Next-hardwired.
190
+ 15. After Q&A: **configure install deploy minimal verify**.
191
+ 16. **No inventing CMS login** from a branding URL.
192
+ 17. **Skip invent.** Stay on Q1–Q3 only.
193
+ 18. **Publish gate:** `/status` JSON + WebSocket 101; no static `public/` trap.
194
+
195
+ **Question order:** Q1 → (auto-set store env) → Q2 → Q3 → execution checklist.
182
196
 
183
197
  ---
184
198
 
@@ -554,7 +568,18 @@ If Vercel’s UI and this file disagree on bundling, **prefer whatever keeps a s
554
568
 
555
569
  ## Question 1 — Database (always)
556
570
 
557
- > **Do not** ask screen counts. Present all three options; recommend **Supabase** for Vercel fleets.
571
+ > **Do not** ask screen counts. Present all three options; recommend **Supabase** for Vercel fleets.
572
+ > **After the user picks a database:** collect the URL if needed, then **you** set `TOMORROWOS_STORE` + `DATABASE_SSL` (see mapping below). The customer must **never** be asked to type those two names or values.
573
+
574
+ ### Agent-owned env mapping (mandatory)
575
+
576
+ | User chose | You set (silently) | User only provides |
577
+ |------------|--------------------|--------------------|
578
+ | 1 Supabase | `TOMORROWOS_STORE=supabase`, `DATABASE_SSL=true` | `SUPABASE_URL` (pooler string) |
579
+ | 2 Neon | `TOMORROWOS_STORE=postgres`, `DATABASE_SSL=true` | `DATABASE_URL` (pooled string) |
580
+ | 3 SQLite | `TOMORROWOS_STORE=sqlite` | Confirmation only |
581
+
582
+ If you open an Env configuration UI for Q1, fields visible to the user may include **only** `SUPABASE_URL` or `DATABASE_URL`. **Do not** show blank `TOMORROWOS_STORE` / `DATABASE_SSL` inputs — write those yourself in the same step.
558
583
 
559
584
  ### Step A — Ask storage choice
560
585
 
@@ -572,9 +597,9 @@ If Vercel’s UI and this file disagree on bundling, **prefer whatever keeps a s
572
597
 
573
598
  ### Step B — If **1 / Supabase**
574
599
 
575
- **Ask exactly (connection string only):**
600
+ **Ask exactly (connection string only — not TOMORROWOS_STORE / DATABASE_SSL):**
576
601
 
577
- > Paste your Supabase Postgres connection string. I will store it as **`SUPABASE_URL`**.
602
+ > Paste your Supabase Postgres connection string. I will store it as **`SUPABASE_URL`**. I will set **`TOMORROWOS_STORE`** and **`DATABASE_SSL`** for you automatically.
578
603
  >
579
604
  > In Supabase: **Project Settings → Database → Connection string → Connection pooling** (Session mode).
580
605
  > Preferred shape:
@@ -582,36 +607,36 @@ If Vercel’s UI and this file disagree on bundling, **prefer whatever keeps a s
582
607
  >
583
608
  > **Do not** use the direct host `db.*.supabase.co:5432` for Vercel.
584
609
 
585
- **You must then (automatic — do NOT ask the user to type these):**
610
+ **You must then (automatic — do NOT ask the user to type store/ssl vars):**
586
611
 
587
- 1. Set Vercel Env Vars:
588
- - `SUPABASE_URL=<user pooler string>`
589
- - `TOMORROWOS_STORE=supabase` ← **agent sets this**
590
- - `DATABASE_SSL=true` ← **agent sets this** (unless user already said SSL is off)
591
- 2. Wire `server.ts` as in **Runtime & Vercel deploy rules**.
612
+ 1. Set Vercel Env Vars in one step:
613
+ - `SUPABASE_URL=<user pooler string>` ← from user
614
+ - `TOMORROWOS_STORE=supabase` ← **you set; never ask**
615
+ - `DATABASE_SSL=true` ← **you set; never ask**
616
+ 2. Wire `cms-app.ts` / `server.ts` store as in **Runtime & Vercel deploy rules**.
592
617
  3. Optional committed `.env.example` with **placeholders only**.
593
618
  4. **Do not** commit the real connection string.
594
- 5. **Do not** open a second form asking for `TOMORROWOS_STORE` or `DATABASE_SSL`.
619
+ 5. **Do not** open a form whose blank fields include `TOMORROWOS_STORE` or `DATABASE_SSL`.
595
620
 
596
621
  ### Step C — If **2 / Neon**
597
622
 
598
623
  **Ask exactly (connection string only):**
599
624
 
600
- > Paste your **Neon pooled** Postgres connection string. I will store it as **`DATABASE_URL`**.
625
+ > Paste your **Neon pooled** Postgres connection string. I will store it as **`DATABASE_URL`**. I will set **`TOMORROWOS_STORE`** and **`DATABASE_SSL`** for you automatically.
601
626
  >
602
627
  > In Neon: **Dashboard → Connection details → Pooled connection**.
603
628
  > Typical shape:
604
629
  > `postgresql://[user]:[password]@[endpoint]-pooler.[region].aws.neon.tech/[dbname]?sslmode=require`
605
630
 
606
- **You must then (automatic — do NOT ask the user to type these):**
631
+ **You must then (automatic):**
607
632
 
608
633
  1. Set Vercel Env Vars:
609
- - `DATABASE_URL=<user pooled string>`
610
- - `TOMORROWOS_STORE=postgres` ← **agent sets this**
611
- - `DATABASE_SSL=true` ← **agent sets this**
612
- 2. Wire `server.ts` — `createTomorrowOSStore` uses `PostgresStore` for `postgres` / `supabase` drivers.
634
+ - `DATABASE_URL=<user pooled string>` ← from user
635
+ - `TOMORROWOS_STORE=postgres` ← **you set; never ask**
636
+ - `DATABASE_SSL=true` ← **you set; never ask**
637
+ 2. Wire `createTomorrowOSStore` for Postgres.
613
638
  3. **Do not** commit the real connection string.
614
- 4. **Do not** ask the user to fill `TOMORROWOS_STORE` or `DATABASE_SSL` in chat or in an Env popup. Those are derived from choosing Neon.
639
+ 4. **Do not** ask the user to fill `TOMORROWOS_STORE` or `DATABASE_SSL` in chat or Env UI.
615
640
  5. If you see `ENETUNREACH` on `:5432`, switch to Neon’s **pooled** URL.
616
641
 
617
642
  ### Step D — If **3 / SQLite**
@@ -625,7 +650,7 @@ Only proceed after the user explicitly confirms.
625
650
  **You must then (automatic):**
626
651
 
627
652
  1. Set `TOMORROWOS_STORE=sqlite` yourself (do not ask the user to type it).
628
- 2. Keep `sqlitePath` in `server.ts` for `data/tomorrowos.db`.
653
+ 2. Keep `sqlitePath` for `data/tomorrowos.db`.
629
654
  3. Warn again in the final summary that they should move to Supabase or Neon for real devices.
630
655
 
631
656
  **Later in Question 3:** set `cms.hostingTarget` to **`"vercel"`** (all Q1 branches).
@@ -635,22 +660,25 @@ Only proceed after the user explicitly confirms.
635
660
  ## Question 2 — Media storage
636
661
 
637
662
  > **This question is only about media files (images/videos).**
638
- > It is **not** about OpenAI, AI pairing, or LLM keys. If you are about to ask for an `sk-` key, **stop** — you are off-protocol.
663
+ > It is **not** about OpenAI, AI pairing, or LLM keys. If you are about to ask for an `sk-` key, **stop** — you are off-protocol.
664
+ > **Copy the three options below verbatim.** Wrong examples that must **never** appear: “Vercel Blob (recommended)”, “Supabase Storage”, “No media storage / disable uploads”.
639
665
 
640
666
  ### Step A — Ask storage choice
641
667
 
642
- **Ask exactly:**
668
+ **Ask exactly (wording must match — Cloudinary is recommended):**
643
669
 
644
670
  > How should playlist media (images/videos) be stored?
645
671
  >
646
- > **1. Cloudinary (recommended)** — durable public HTTPS URLs (`https://res.cloudinary.com/...`). Works out of the box with `@tomorrowos/sdk` auto-detection.
672
+ > **1. Cloudinary (recommended)** — durable public HTTPS URLs (`https://res.cloudinary.com/...`). Works out of the box with `@tomorrowos/sdk` auto-detection. **Prefer this on Vercel.**
647
673
  >
648
- > **2. Vercel Blob** — Vercel-native object storage; durable `https://*.public.blob.vercel-storage.com/...` URLs. Good when you want media on the same Vercel project without a Cloudinary account.
674
+ > **2. Vercel Blob** — Vercel-native object storage; durable `https://*.public.blob.vercel-storage.com/...` URLs. Use when you want media on the same Vercel project without a Cloudinary account.
649
675
  >
650
- > **3. Local disk only** — `public/uploads` (OK for quick local tests; **not** for production Vercel fleets — files are ephemeral).
676
+ > **3. Local disk only** — `cms-panel/uploads` or `public/uploads` (OK for quick local tests; **not** for production Vercel fleets — files are ephemeral).
651
677
  >
652
678
  > Reply with **1**, **2**, or **3** (or “Cloudinary” / “Vercel Blob” / “local”).
653
679
 
680
+ If you catch yourself about to offer Blob-as-recommended, Supabase Storage, or “no media”, **stop and paste the block above instead**.
681
+
654
682
  ### Step B — If **1 / Cloudinary** (same Question 2 — **one Env popup**)
655
683
 
656
684
  > **Critical UX rule:** Immediately open the **Vercel Environment Variables configuration popup / form** with **all Cloudinary fields in one UI**. Do **not** ask for cloud name, then key, then secret in separate chat messages.
@@ -837,8 +865,8 @@ Then (**Scheme A — mandatory for Publish**):
837
865
  |------|----------|--------------|
838
866
  | `SUPABASE_URL` | If Q1 = Supabase | User pastes URL |
839
867
  | `DATABASE_URL` | If Q1 = Neon | User pastes URL |
840
- | `TOMORROWOS_STORE` | Yes | **Agent auto-sets** (`supabase` / `postgres` / `sqlite`) |
841
- | `DATABASE_SSL` | Yes for Postgres | **Agent auto-sets** `true` |
868
+ | `TOMORROWOS_STORE` | Yes | **Agent auto-sets only** — never a blank field for the user (`supabase` / `postgres` / `sqlite`) |
869
+ | `DATABASE_SSL` | Yes for Postgres | **Agent auto-sets only** — never a blank field for the user (`true`) |
842
870
  | `CLOUDINARY_*` | If Q2 = Cloudinary | User via **one Env popup** (all fields) |
843
871
  | `BLOB_READ_WRITE_TOKEN` | If Q2 = Vercel Blob | User / Blob link |
844
872
  | `TOMORROWOS_INTERNAL_PORT` | Preview only | Agent (e.g. `3001`) |
@@ -920,7 +948,8 @@ Tell the user:
920
948
  | Blob uploads 401 / missing token | Blob not linked | Vercel Storage → Blob + `BLOB_READ_WRITE_TOKEN` |
921
949
  | WebSocket fails on Publish | Fluid off / static-only / Next as Production / no Function WS | Enable Fluid; Scheme A; test 101 upgrade |
922
950
  | Devices fail only on Preview | Next proxy cannot upgrade `wss` | Expected — pair on Publish URL |
923
- | Agent asked user to fill `TOMORROWOS_STORE` / `DATABASE_SSL` | Off-protocol | Agent must auto-set those after Neon/Supabase choice |
951
+ | Agent asked user to fill `TOMORROWOS_STORE` / `DATABASE_SSL` | Off-protocol | Agent must auto-set after DB choice; remove those fields from user Env forms |
952
+ | Agent offered Blob-as-recommended / Supabase Storage / “no media” for Q2 | Invented options | Re-ask Q2 verbatim: **1 Cloudinary (recommended)**, 2 Blob, 3 local |
924
953
  | Agent asked Cloudinary key/secret in three chat turns | Off-protocol | Use **one Env popup** with all Cloudinary fields |
925
954
  | Agent asked for OpenAI / `sk-` key during setup | Hallucinated “AI pairing” requirement | **Refuse.** TomorrowOS does not need LLM keys. Return to Q2 media choices only |
926
955
  | Agent built a login page after user pasted a URL | Misread brand reference as product scope | Remove login; keep starter Control Panel; apply URL only to `brand.json` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomorrowos/sdk",
3
- "version": "0.9.32",
3
+ "version": "0.9.33",
4
4
  "description": "TomorrowOS CMS server SDK - WebSocket transport, pairing, device commands, optional static CMS UI. Includes CLI (tomorrowos init / build) and starter templates.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-cms",
3
- "version": "0.9.32",
3
+ "version": "0.9.33",
4
4
  "description": "CMS server on @tomorrowos/sdk. Add your UI (React, static files, etc.) alongside this server.",
5
5
  "private": true,
6
6
  "type": "module",
@@ -13,7 +13,7 @@
13
13
  "build-player": "tomorrowos build --platform tizen"
14
14
  },
15
15
  "dependencies": {
16
- "@tomorrowos/sdk": "^0.9.32",
16
+ "@tomorrowos/sdk": "^0.9.33",
17
17
  "dotenv": "^17.2.3",
18
18
  "tsx": "^4.19.0"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-cms",
3
- "version": "0.9.32",
3
+ "version": "0.9.33",
4
4
  "description": "TomorrowOS CMS for Vercel / v0 Publish (Fluid Function + WebSockets + optional Next Preview).",
5
5
  "private": true,
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "build-player": "tomorrowos build --platform tizen"
18
18
  },
19
19
  "dependencies": {
20
- "@tomorrowos/sdk": "^0.9.32",
20
+ "@tomorrowos/sdk": "^0.9.33",
21
21
  "dotenv": "^17.2.3",
22
22
  "tsx": "^4.19.0"
23
23
  },